You can simplify that code quite a bit with a counting loop and
multiple assignment.
on shuffle (aList)
set length to count aList
repeat with i from count to 2 by -1
set j to random number between 1 and i
if j is not I then
tell aList to set {item i, item j} to {item j, item i}
end if
end repeat
end shuffle
A common error is to replace the random number bounds to (1..i-1),
eliminating the if conditional and guaranteeing a swap on each step,
but then the distribution of resulting permutations is no longer even.
On 4/13/08, Chuck Pelto <[log in to unmask]> wrote:
> On Apr 13, 2008, at 1:26 PM, Chuck Pelto wrote:
>
> >
> > On Apr 13, 2008, at 1:12 PM, Chuck Pelto wrote:
> >
> >>
> >> On Apr 13, 2008, at 1:01 PM, Mark J. Reed wrote:
> >>
> >>> On Sun, Apr 13, 2008 at 2:51 PM, Chuck Pelto <[log in to unmask]>
> >>> wrote:
> >>>> Does anyone have a good suggestion on how to shuffle the
> >>>> contents of a list?
> >>>
> >>> Fisher-Yates is a good algorithm. What language?
> >>
> >> Working with AppleScript; ScriptDebugger.
> >>
> >> Where can I find the Fisher-Yates?
> >
> > Found it. Looks simple enough.
>
> Here's what I've done.....
>
> on ShuffleList(thisList)
>
> set iCount to (count of items in thisList) -- get number of items in
> the list
>
> set itCount to iCount
>
> repeat until itCount < 2
>
> set randNumb to (random number from 1 to itCount)
>
> if randNumb is not equal to itCount then
>
> set i1 to item itCount of thisList
> set i2 to item randNumb of thisList
>
> set item itCount of thisList to i2
> set item randNumb of thisList to i1
>
> end if
>
> set itCount to itCount - 1
>
> end repeat
>
> return thisList
>
> end ShuffleList
>
>
> It's not particularly elegant, but it works.
>
--
Sent from Gmail for mobile | mobile.google.com
Mark J. Reed <[log in to unmask]>
|