To read the article online, visit http://www.4GuysFromRolla.com/webtech/110800-1.shtml

Randomly Reordering an Array

Imagine that you have a single-dimension array whose contents you'd like to display. You can do this with some very simple code:

 'assume array to display - aNames has been created... Dim iLoop For iLoop = LBound(aNames) to UBound(aNames) Response.Write aNames(iLoop) & "
" Next

Clearly, this code will list each element in the array, starting at the first element and iterating through to the last element. With just this code, though, with a static array your users will see the exact same output each time they visit this ASP page! Boring. Rather, why not randomly reorder the array so that, when the above snippet of code is used to display the array, the output differs?

Now, before you say, "OK, sure, let's do it," take a moment to step back and think about the challenges involved. How could we accomplish this? One quick and dirty way to do this is to step through the array one element at a time, randomly picking a number between the upper and lower bounds of the array, and swap the value of the element of the array at the current position with the element of the array at the position of the randomly selected number.

WARNING: This Approach Has Subtle Flaws!
While the naive algorithm shown here certainly does jumble the contents of an array, it does not do so in a manner that produces an even distribution of random results. For more information on the shortcomings of this algorithm, as well as two alternative correct approaches, check out: Techniques for Randomly Reordering an Array.

To see this method in action, review (and demo) the following code:

 <% '**************************************** ' This function randomly reorders the ' array aArray using a quick and dirty ' approach... It's fast! '**************************************** Function ReOrderArrayQuickNDirty(ByVal aArray) Dim iUpper, iLower, iLoop, iSwapPos, varTmp iUpper = UBound(aArray) iLower = LBound(aArray) Randomize Timer 'Loop through the array, randomly swapping values For iLoop = iLower to iUpper 'Get an array index to swap iSwapPos = Int(Rnd * (iUpper + 1)) 'Swap the current element with the element at iSwapPos varTmp = aArray(iLoop) aArray(iLoop) = aArray(iSwapPos) aArray(iSwapPos) = varTmp Next ReOrderArrayQuickNDirty = aArray 'Return the jumbled array End Function Dim aSites ReDim aSites(2) aSites(0) = "4GuysFromRolla.com" aSites(1) = "ASPMessageboard.com" aSites(2) = "ASPFAQs.com" 'Display the array in-order Dim iLoop For iLoop = LBound(aSites) to UBound(aSites) Response.Write aSites(iLoop) & "
" Next response.write "

" 'Jumble up the array and display the new, random order! aSites = ReOrderArrayQuickNDirty(aSites) For iLoop = LBound(aSites) to UBound(aSites) Response.Write aSites(iLoop) & "
" Next %>

[View the live demo!]

There are, of course, other methods for randomly reordering an array. We'll examine some alternative techniques in Part 2.