Pseudo-random numbers/Splitmix64: Difference between revisions
no edit summary
m (Changed class name to better reflect task requirements.) |
No edit summary |
||
Line 1,055:
16408922859458223821
0: 20027 1: 19892 2: 20073 3: 19978 4: 20030
</pre>
=={{header|Odin}}==
Based on the C reference implementation.
<syntaxhighlight lang="odin">package main
import "core:fmt"
import "core:math"
TWO64 :f64: 1 << 64
SplitMix64 :: struct {
state: u64,
}
next_int :: proc(rng: ^SplitMix64) -> u64 {
rng.state += 0x9e3779b97f4a7c15
z := rng.state
z = (z ~ (z >> 30)) * 0xbf58476d1ce4e5b9
z = (z ~ (z >> 27)) * 0x94d049bb133111eb
return z ~ (z >> 31)
}
next_float :: proc(rng: ^SplitMix64) -> f64 {
return f64(next_int(rng)) / TWO64
}
main :: proc() {
rng := SplitMix64{1234567}
for i in 0..<5 {
fmt.println(next_int(&rng))
}
rng.state = 987654321
vec5 := [5]int{0,0,0,0,0}
for i in 0..<100000 {
j := int(math.floor(next_float(&rng) * 5.))
vec5[j] += 1
}
for v,i in vec5 {
fmt.printf("%d: %d ", i, v)
}
}
</syntaxhighlight>{{out}}
<pre>
6457827717110365317
3203168211198807973
9817491932198370423
4593380528125082431
16408922859458223821
0: 20027 1: 19892 2: 20073 3: 19978 4: 20030
</pre>
|