Of course you will want to do it differently, but here is something I wrote to play with this. I used the ntheory module because it has different RNGs as well as gcd and Pi.
#!/usr/bin/env perl
use warnings;
use strict;
use ntheory ":all";
cesaro("drand48", sub { int(rand(1<<32)) } );
cesaro("ChaCha20", sub { irand64 } );
cesaro("/dev/urandom", sub { unpack("Q",random_bytes(8)) } );
sub cesaro {
my($name, $rng) = @_;
print "Using $name:\n";
for my $e (1..7) {
my $n = 10**$e;
my $t = 0;
for (1..$n) { $t++ if gcd( $rng->(), $rng->() ) == 1; }
printf "%8d %10.8f\n", $n, sqrt(6*$n/$t);
}
print " Pi ", Pi(), "\n\n";
}
I saved cut-n-paste by passing in the RNG code. One for Perl's default rand (which is drand48 on modern Perl), one for ntheory's CSPRNG, and one that gets data from /dev/urandom. You could replace that with something that got data from random.org. There are even a couple modules that do it automatically (Math::RandomOrg and Data::Entropy). Since we expect t/n ~ 6/Pi^2, a little algebra gives us Pi ~ sqrt(6n/t). I don't believe we can read anything into what the results might mean for the different RNG methods. The results will be different every time unless we seed (and the last can't be seeded since it is O/S collected entropy (long technical discussion of /dev/random vs. /dev/urandom vs. hardware could be had here)).
Using drand48:
10 2.73861279
100 3.06186218
1000 3.15964572
10000 3.14632429
100000 3.13988122
1000000 3.14035598
10000000 3.14143144
Pi 3.14159265358979
Using ChaCha20:
10 3.16227766
100 3.18896402
1000 3.17287158
10000 3.15675816
100000 3.14329189
1000000 3.13978836
10000000 3.14138726
Pi 3.14159265358979
Using /dev/urandom:
10 3.46410162
100 3.03821810
1000 3.11588476
10000 3.14217962
100000 3.13643021
1000000 3.14020372
10000000 3.14130744
Pi 3.14159265358979
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.