Pseudo-random numbers/Splitmix64: Difference between revisions
Content added Content deleted
m (Changed class name to better reflect task requirements.) |
No edit summary |
||
Line 1,055: | Line 1,055: | ||
16408922859458223821 |
16408922859458223821 |
||
0: 20027 1: 19892 2: 20073 3: 19978 4: 20030 |
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> |
</pre> |
||