Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
I am the chief technical officer at InVision App, Inc - a prototyping and collaboration platform for designers, built by designers. I also rock out in JavaScript and ColdFusion 24x7.
Meanwhile on Twitter
Loading latest tweet...
Ben Nadel at CFUNITED 2010 (Landsdown, VA) with: Rolando Lopez

Getting Ready For The ColdFusion Post-Christmas Raffle

By Ben Nadel on
Tags: ColdFusion

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

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.

Reply to this Comment

Post A Comment

?
You — Get Out Of My Dreams, Get Into My Comments
Live in the Now
Oops!
Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.