Randomly Sorting An Array In ColdFusion

Posted September 19, 2006 at 2:23 PM by Ben Nadel

Tags: ColdFusion

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:


 
 
 

 
CFDump 1 : Randomly Sorting An Array In ColdFusion  
 
 
 

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:


 
 
 

 
CFDump 2 : Randomly Sorting An Array In ColdFusion  
 
 
 

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

Sep 19, 2006 at 10:02 PM // reply »
24 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)


Sep 20, 2006 at 7:41 AM // reply »
10,640 Comments

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 :(


Jul 28, 2011 at 2:08 PM // reply »
336 Comments

and now we learn that Anna is actually a brunette, not a dirty blonde. :-P Haha, just kidding. Good work, Ben.


Post A Comment

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.

Please review the following issues:

Author Name:


Author Email:

Author Website:

Comment:

Supported HTML tags for formatting: <strong>bold</strong>   <em>italic</em>   <code>code</code>







  • Help Wanted - Find Your Next ColdFusion Job
InVision App - Prototyping Made Beautiful With Prototyping Tools Ben Nadel's Company - Epicenter Consulting Recent Blog Comments
Feb 10, 2012 at 7:21 PM
jQuery AJAX Strips Script Tags And Inserts Them After Parent-Most Elements
Update! Instead of $(eval(options.insertAfter)).after(data['insertData']); I now use: var ajaxNode = document.createElement('span'); var parent = $(eval(options.insertAfter))[0].parentNode; ... read »
Feb 10, 2012 at 6:18 PM
jQuery AJAX Strips Script Tags And Inserts Them After Parent-Most Elements
encountered this same, what I consider, jQuery bug last week. I'm building a site in which I load some content via AJAX. This content contains Linkedin share button placeholders which Linkedin API ne ... read »
Feb 10, 2012 at 11:30 AM
Cross-Origin Resource Sharing (CORS) AJAX Requests Between jQuery And Node.js
After you understand the concepts here, this is an awesome cheatsheet for enabling CORS in just about anything http://enable-cors.org/ ... read »
JM
Feb 10, 2012 at 9:10 AM
My Safari Browser SQLite Database Hello World Example
@Amy, Here is a very good tutorial on how to use JOIN: http://www.sqltutorial.org/sqljoin-innerjoin.aspx ... read »
Feb 10, 2012 at 4:42 AM
Building A Twitter-Inspired RESTful API Architecture In ColdFusion
This is great, very useful Ben. I spotted a small typo in the api.cgm listing: <cfthrow type="Unauthroized" /> Cheers Stefan ... read »
Feb 9, 2012 at 10:35 PM
CFDirectory Filtering Uses Pipe Character For Multiple Filters (Thanks Steve Withington)
I was wondering if there would be a filter you could apply so that you got everything but what you included in the filter. As in show me all docs that are not a .pdf. ... read »
Feb 9, 2012 at 10:29 PM
Learning ColdFusion 9: Application-Specific Data Sources
@Ben, No offence, but if people were really wanting advanced features they would be using a platform like ASP.NET MVC. CFML is so structurally compromised as a tag-based scripting language that ... read »
Feb 9, 2012 at 10:03 PM
Subversion - Cleanup Failed To Process The Following Paths
@Leviaguirre, do you still have problems with this? ... read »