Skip to main content
Ben Nadel at cf.Objective() 2017 (Washington, D.C.) with: Geoff Bowers
Ben Nadel at cf.Objective() 2017 (Washington, D.C.) with: Geoff Bowers

Getting Ready For The ColdFusion Post-Christmas Raffle

By
Published in Comments (2)

This Christmas, I tried to give away some little "Kinky Solutions" gifts to people. Some people accepted, others passed. As a result, I have a few surplus gifts lying around that I would like to raffle off. In preparation for this post-Christmas gift raffle, I wrote a small little raffling system in ColdFusion that will help me select the names of anyone who is interested.

This small ColdFusion raffling algorithm takes a text file (.txt) of entry names and basically selects random records from it. However, I know that randomization on a computer is merely generated and not truly random. To help make the raffle more fair, for each entry selection I both shuffle the entries and then select a random index. Ok ok, maybe this has more to with entertaining myself than it does with making it fair... but come on, how often do I get to use the Java Collections object? Sometimes you just have to invent reasons to "use" when nothing logically presents itself :D

<!--- Read in the entries data file. --->
<cffile
	action="READ"
	file="#ExpandPath( './entries.txt' )#"
	variable="lstEntries"
	/>


<!---
	Convert the entries to an array. This is expecting a
	single entry per line of the text file.
--->
<cfset arrEntries = ListToArray(
	lstEntries,
	"#Chr( 13 )##Chr( 10 )#"
	) />


<!---
	Get the number of random entries to pick for raffle.
	This is number of lucky winners :)
--->
<cfset intPickCount = 3 />

<!---
	Create an array for selecting raffle entries
	(the winning picks).
--->
<cfset arrPicks = ArrayNew( 1 ) />


<!---
	Create a collection class. We are going to use the
	static method Shuffle() to help randomize the winning
	pick selection.
--->
<cfset objCollection = CreateObject(
	"java",
	"java.util.Collections"
	) />


<!---
	Loop over the entries to select. We are going to only loop
	enough times to pick the number of selected entries. Of
	coures, if our entry list is smaller than our max pick
	count, then we will only loop enough times to select every
	one on the list (everyone wins).
--->
<cfloop
	index="intI"
	from="1"
	to="#Min( intPickCount, ArrayLen( arrEntries ) )#"
	step="1">

	<!---
		Shuffle the entries array. Since the arrays are passed
		by reference into the Shuffle() method (or perhaps more
		appropriately, passed BACK by reference), we do not
		need to store the resultant array back into itself.
	--->
	<cfset objCollection.Shuffle( arrEntries ) />

	<!---
		Even though the entries array has been shuffled, let's
		also select a random index from within the entries to
		help randomize.
	--->
	<cfset intEntry = RandRange( 1, ArrayLen( arrEntries ) ) />

	<!--- Add that index to the picks. --->
	<cfset ArrayAppend( arrPicks, arrEntries[ intEntry ] ) />

	<!---
		Delete selected pick so that it cannot be selected
		again in a future loop iteration.
	--->
	<cfset ArrayDeleteAt( arrEntries, intEntry ) />

</cfloop>

<!---
	Write the entries to file. In order to convert the array
	back to a text file, we are going to convert it to a
	list that uses line breaks and carriage returns as
	its item delimiters.
--->
<cffile
	action="WRITE"
	file="#ExpandPath( './winners.txt' )#"
	output="#ArrayToList( arrPicks, (Chr( 13 ) & Chr ( 10 )) )#"
	addnewline="false"
	fixnewline="true"
	/>

Want to use code from this post? Check out the license.

Reader Comments

3 Comments

It never ceases to amaze me that almost every time I have a coldfusion question and I search for the answer on the Internet, I end up on this site. Today I wanted to look for any coldfusion raffle programs because one of my clients is planning to do a raffle later this year.

I believe in love. I believe in compassion. I believe in human rights. I believe that we can afford to give more of these gifts to the world around us because it costs us nothing to be decent and kind and understanding. And, I want you to know that when you land on this site, you are accepted for who you are, no matter how you identify, what truths you live, or whatever kind of goofy shit makes you feel alive! Rock on with your bad self!
Ben Nadel