Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: Randomize an array

by Adam (Vicar)
on Sep 08, 2000 at 03:00 UTC ( [id://31510]=note: print w/replies, xml ) Need Help??


in reply to Randomize an array

I was thinking about that "one line" of code... and wondering if it was really a good shuffle. I'm not convinced that it is a better shuffle then Fisher-Yate's, since it doesn't seem to allow anything to stay in its original location. It also occured to me that calling QuickSort with a random requirement like that would take awhile. So I ran a benchmark.
DB<4> sub Shuffle{my $ar=shift; my $i=@$ar; while($i--){my $n=int ra +nd(1+$i); @$ar[$i,$n]=@$ar[$n,$i]}} DB<5> @a = ( 0..9999 ) DB<6> timethese( 1000, { FY => 'Shuffle(\@a)', SR => '@a=sort{(-1,1) +[rand 2]}@a' }) Benchmark: timing 1000 iterations of FY, SR... FY: 63 wallclock secs (61.93 usr + 0.00 sys = 61.93 CPU) @ 16 +.15/s (n=1 000) SR: 157 wallclock secs (155.34 usr + 0.00 sys = 155.34 CPU) @ + 6.44/s ( n=1000)
Which I read to say Fisher-Yates is almost three times faster then the one-liner.

Replies are listed 'Best First'.
RE (tilly) 2 (one is worse): Re: Randomize an array
by tilly (Archbishop) on Sep 08, 2000 at 03:23 UTC
    The one-line should be a good shuffle. However it is O(n log(n)) and Fisher-Yate's is O(n), so the longer code really is better algorithmically.
      I really should have paid more attention in Algorithm's analysis. Sigh. Maybe I'll take the next level of it when I go back to grad school. You are right. Sort is an implementation of QuickSort ( O(n log n) using lots of memory) while Fisher-Yates is O(n) with a constant defined only by how long it takes to do the rand and the swap. (We had that discussion already. <grin>) So this makes sense. And of course, this defends my suggestion that Fisher-Yates is preferable to the one-liner. Thanks tilly, maybe one day my education will start to sink in.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://31510]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (6)
As of 2024-04-25 08:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found