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

Content added Content deleted
(Promote to full task status)
(Added Perl)
Line 238: Line 238:
1: 20002 2: 20060 3: 19948 4: 20059 5: 19931
1: 20002 2: 20060 3: 19948 4: 20059 5: 19931
</pre>
</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}}==
=={{header|Phix}}==