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

Lots of rand()s

by David Caughell (Monk)
on Mar 08, 2004 at 11:59 UTC ( [id://334772]=CUFP: print w/replies, xml ) Need Help??

Some of the coolest programs are the ones with random results... russian roullette, initial placement in Life, etc.

I wanted to see how close to even rand() would get over a large sample size, so I ran 100 million tests, and published the results.

If this gets moved to Code Catacombs, that's fine by me. It's not exactly cool, but it is cool by extension. :)

Also, if someone would like to comment on how it could be made more efficient, that would be awesome! I'm specifically interested in the while block, because it's the workhorse, though other comments are good too.

Code:

#!/usr/bin/perl -w use strict; my ($counter, $tests) = (0, 100_000_000); my %results; my $rand; #declare once, save time while ($counter++ < $tests) { #not creating with .. operator, m +em efficient $rand = int(rand(10) + 1); $results{$rand}++; } my $total; $total += $_ for values %results; #only 10 results possible print "\n\n"; print "Total\t$total\n\n"; print "$_:\t$results{$_}\t\t" . $results{$_} / $total * 100 . "\n" for sort {$a <=> $b} keys %results; print "\n\n";

Output:

Total   100000000
 
1:      10003440                10.00344
2:      9996091         9.996091
3:      10004370                10.00437
4:      9996926         9.996926
5:      10000607                10.000607
6:      9998471         9.998471
7:      10002412                10.002412
8:      9997738         9.997738
9:      9999782         9.999782
10:     10000163                10.000163

Replies are listed 'Best First'.
Re: Lots of rand()s
by Albannach (Monsignor) on Mar 08, 2004 at 14:22 UTC
    Your comment #not creating with .. operator, mem efficient is somewhat outdated, as for several major releases now (at least since 5.005_03) the .. operator has not created a masive temporary array as it was wont to do in earlier times. So unless you are using an old version of Perl, please feel free to use  for(1..1_000_000) without fear, and avoid clumsy alternatives!

    Update: Back to your topic, this little exercise isn't a new idea, but it is a good thing to try in order to get some understanding of rand. You might try different pseudo-random number generation functions (a quick google should turn up lots) or indeed some CPAN options) and compare the results, especially if you are going to rely on rand for any meaningful purpose (e.g. we use Monte-Carlo economic simulations on occasion). You might also consider the distribution being generated - the built-in functions typically generate uniform distributions, but for many purposes that isn't immediately suitable. In the real world however, if you do need lots of pseudo-random numbers you're most likely better off with a non-default algorithm coded in C for speed, or some real randomness.

    --
    I'd like to be able to assign to an luser

      Re: the .. operator. Thanks for pointing that out (this is the kind of thing I wanted to know).

      I'm not a stats major, and this isn't a life-or-death thing, (there are other nodes dealing with true randomness on PM), I just wanted to know whether the results would come up distributed relatively evenly.

      Thanks for the reply,
      Dave
      
Re: Lots of rand()s
by Jaap (Curate) on Mar 08, 2004 at 12:46 UTC
    Here's an optimization:
    $results{int(rand(10) + 1)}++;
    There's no need to write it to $rand first. This should be a little bit faster.

    What are you trying to prove with this? That rand() is not really random?

      Hey Jaap,

      I'm not trying to prove anything. I just wanted to see what the results would be, and since I figured other people might want to also, I posted the results.

      Thanks for the optimization... makes a lot of sense. :)

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (8)
As of 2024-04-19 13:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found