Pseudo-random numbers/Combined recursive generator MRG32k3a: Difference between revisions
Content added Content deleted
(Promote to full task status) |
SqrtNegInf (talk | contribs) (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}}== |