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) & "<BR>"
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) & "<BR>"
Next
response.write "<P>"

'Jumble up the array and display the new, random order!
aSites = ReOrderArrayQuickNDirty(aSites)
For iLoop = LBound(aSites) to UBound(aSites)
  Response.Write aSites(iLoop) & "<BR>"
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.

  • Read Part 2!


  • Article Information
    Article Title: Randomly Reordering an Array
    Article Author: Scott Mitchell
    Published Date: Wednesday, November 08, 2000
    Article URL: http://www.4GuysFromRolla.com/webtech/110800-1.shtml


    Copyright 2014 QuinStreet Inc. All Rights Reserved.
    Legal Notices, Licensing, Permissions, Privacy Policy.
    Advertise | Newsletters | E-mail Offers