Pseudo-random numbers/Xorshift star: Difference between revisions
Content added Content deleted
Line 811: | Line 811: | ||
3: 20031 |
3: 20031 |
||
4: 20007</pre> |
4: 20007</pre> |
||
=={{header|Nim}}== |
|||
<lang Nim>import algorithm, sequtils, strutils, tables |
|||
const C = 0x2545F4914F6CDD1Du64 |
|||
type XorShift = object |
|||
state: uint64 |
|||
func seed(gen: var XorShift; num: uint64) = |
|||
gen.state = num |
|||
func nextInt(gen: var XorShift): uint32 = |
|||
var x = gen.state |
|||
x = x xor x shr 12 |
|||
x = x xor x shl 25 |
|||
x = x xor x shr 27 |
|||
gen.state = x |
|||
result = uint32((x * C) shr 32) |
|||
func nextFloat(gen: var XorShift): float = |
|||
gen.nextInt().float / float(0xFFFFFFFFu32) |
|||
when isMainModule: |
|||
var gen: XorShift |
|||
gen.seed(1234567) |
|||
for _ in 1..5: |
|||
echo gen.nextInt() |
|||
echo "" |
|||
gen.seed(987654321) |
|||
var counts: CountTable[int] |
|||
for _ in 1..100_000: |
|||
counts.inc int(gen.nextFloat() * 5) |
|||
echo sorted(toSeq(counts.pairs)).mapIt($it[0] & ": " & $it[1]).join(", ")</lang> |
|||
{{out}} |
|||
<pre>3540625527 |
|||
2750739987 |
|||
4037983143 |
|||
1993361440 |
|||
3809424708 |
|||
0: 20103, 1: 19922, 2: 19937, 3: 20031, 4: 20007</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |