Getting Ready For The ColdFusion Post-Christmas Raffle
Posted December 27, 2006 at 4:57 PM by Ben Nadel
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"
- />
Reader Comments
his small ColdFusion raffling algorithm takes a text file



