Randomly Sorting An Array In ColdFusion
Posted September 19, 2006 at 2:23 PM by Ben Nadel
I touched upon this a bit when I was talking about randomly sorting a list in ColdFusion. Actually, one of the solutions to that problem was to create, as an interim object, a randomly sorted array. I figured as an example, I would just break it out here to see how it works.
To start with, as always, let's build an array:
- <!--- Set the number of records. --->
- <cfset intRecordCount = 4 />
-
- <!--- Create an array. --->
- <cfset arrGirls = ArrayNew( 1 ) />
-
- <!--- Resize the array to be our test number. --->
- <cfset ArrayResize( arrGirls, intRecordCount ) />
-
- <!--- Now, we need to populate the array with data. --->
- <cfloop index="intI" from="1" to="#intRecordCount#" step="1">
-
- <!--- Create a struct for the girl data. --->
- <cfset arrGirls[ intI ] = StructNew() />
-
- <!--- Set the ID to be the index. --->
- <cfset arrGirls[ intI ].ID = intI />
-
- <!--- Now, randomly pick a girl to create. --->
- <cfswitch expression="#RandRange( 1, 3 )#">
- <cfcase value="1">
-
- <cfset arrGirls[ intI ].Name = "Anna" />
- <cfset arrGirls[ intI ].Hair = "Dirty Blonde" />
-
- </cfcase>
- <cfcase value="2">
-
- <cfset arrGirls[ intI ].Name = "Alex" />
- <cfset arrGirls[ intI ].Hair = "Blonde" />
-
- </cfcase>
- <cfcase value="3">
-
- <cfset arrGirls[ intI ].Name = "Jo" />
- <cfset arrGirls[ intI ].Hair = "Brunette" />
-
- </cfcase>
- </cfswitch>
-
- </cfloop>
We should now have an array that is 4 items long:
| | | | ||
| | ![]() | | ||
| | | |
I am keeping short for the demo. Now, we want to randomize the order of it. To do this, we are going to loop over the array N times and swap the item at the current index with the a random item in the array. I am not sure how *random* this is. I am sure that are mathematical proofs for determining how many times you should run across the array, but I am not gonna get into it. For now, this seems to work fine:
- <!---
- Loop over the array N times. In this case, I am
- going to be looping twice.
- --->
- <cfloop index="intN" from="1" to="2" step="1">
-
- <!--- Loop over the array. --->
- <cfloop index="intI" from="1" to="#ArrayLen( arrGirls )#" step="1">
-
- <!---
- Swap the current item with a randomly chosen item.
- We are getting the random index via RandRange().
- --->
- <cfset ArraySwap(
- arrGirls,
- intI,
- RandRange( 1, ArrayLen( arrGirls ) )
- ) />
-
- </cfloop>
-
- </cfloop>
Our array should now be randomly sorted:
| | | | ||
| | ![]() | | ||
| | | |
I am not sure about speed testing because I don't really have anything to compare it to. The time it takes to process should increase linearly with the size of the array.
Reader Comments
I think you'll hate me for this... but there is an easy java way to do this.
(this is off the top of my head, but it should work)
<cfscript>
Collections = createObject("java", "java.util.Collections");
Collections.shuffle(yourArray);
</cfscript>
There you go, the array is shuffled.
(I didn't test this btw, but I can't see why it wouldn't work)
Mark,
Firstly, I am NEVER gonna hate learning how to do things an easier, simpler way.
Secondly, I am stuck without network access at the moment and can't test this stuff. But, from the documentation on collections, this seems totally valid. I am starting to like this Collections class.
I will test as soon as my boss gets here and give me back my network access :(
and now we learn that Anna is actually a brunette, not a dirty blonde. :-P Haha, just kidding. Good work, Ben.





