Pseudo-random numbers/Splitmix64: Difference between revisions
Content added Content deleted
No edit summary |
SqrtNegInf (talk | contribs) (Added Perl) |
||
Line 320: | Line 320: | ||
0: 20027 1: 19892 2: 20073 3: 19978 4: 20030 |
0: 20027 1: 19892 2: 20073 3: 19978 4: 20030 |
||
</pre> |
</pre> |
||
=={{header|Perl}}== |
|||
<lang perl>use strict; |
|||
use warnings; |
|||
no warnings 'portable'; |
|||
use feature 'say'; |
|||
use Math::AnyNum qw(:overload); |
|||
{ package splitmix64; |
|||
our($state); |
|||
sub new { $state = $_[2] } |
|||
sub next_int { |
|||
my $next = $state = ($state + 0x9e3779b97f4a7c15) & (2**64 - 1); |
|||
$next = ($next ^ ($next >> 30)) * 0xbf58476d1ce4e5b9 & (2**64 - 1); |
|||
$next = ($next ^ ($next >> 27)) * 0x94d049bb133111eb & (2**64 - 1); |
|||
($next ^ ($next >> 31)) & (2**64 - 1); |
|||
} |
|||
} |
|||
say 'Seed: 1234567, first 5 values:'; |
|||
my $rng = splitmix64->new( seed => 1234567 ); |
|||
say splitmix64->next_int($rng) for 1..5; |
|||
my %h; |
|||
say "\nSeed: 987654321, values histogram:"; |
|||
$rng = splitmix64->new( seed => 987654321 ); |
|||
$h{int 5 * splitmix64->next_int($rng)/2**64}++ for 1..100_000; |
|||
say "$_ $h{$_}" for sort keys %h;</lang> |
|||
{{out}} |
|||
<pre>Seed: 1234567, first 5 values: |
|||
6457827717110365317 |
|||
3203168211198807973 |
|||
9817491932198370423 |
|||
4593380528125082431 |
|||
16408922859458223821 |
|||
Seed: 987654321, values histogram: |
|||
0 20027 |
|||
1 19892 |
|||
2 20073 |
|||
3 19978 |
|||
4 20030</pre> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |