Jump to content

Pseudo-random numbers/Combined recursive generator MRG32k3a: Difference between revisions

Added Perl
(Promote to full task status)
(Added Perl)
Line 238:
1: 20002 2: 20060 3: 19948 4: 20059 5: 19931
</pre>
 
=={{header|Perl}}==
<lang perl>use strict;
use warnings;
use feature 'say';
 
{ package MRG32k3a;
 
our(@x1,@x2);
our $m1 = 2**32 - 209;
our $m2 = 2**32 - 22853;
our @a1 = < 0 1403580 -810728>;
our @a2 = <527612 0 -1370589>;
 
sub new { @x1 = @x2 = ($_[2], 0, 0) }
 
sub next_int {
unshift @x1, ($a1[0] * $x1[0] + $a1[1] * $x1[1] + $a1[2] * $x1[2]) % $m1; pop @x1;
unshift @x2, ($a2[0] * $x2[0] + $a2[1] * $x2[1] + $a2[2] * $x2[2]) % $m2; pop @x2;
($x1[0] - $x2[0]) % ($m1 + 1)
}
 
sub next_float { next_int() / ($m1 + 1) }
}
 
say 'Seed: 1234567, first 5 values:';
my $rng = MRG32k3a->new( seed => 1234567 );
say MRG32k3a->next_int($rng) for 1..5;
 
my %h;
say "\nSeed: 987654321, values histogram:";
$rng = MRG32k3a->new( seed => 987654321 );
$h{int 5 * MRG32k3a->next_float($rng)}++ for 1..100_000;
say "$_ $h{$_}" for sort keys %h;</lang>
{{out}}
<pre>Seed: 1234567, first 5 values:
1459213977
2827710106
4245671317
3877608661
2595287583
 
Seed: 987654321, values histogram:
0 20002
1 20060
2 19948
3 20059
4 19931</pre>
 
=={{header|Phix}}==
2,392

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.