Subtractive generator: Difference between revisions

Content added Content deleted
Line 1,181: Line 1,181:
var r: set[int16]
var r: set[int16]
for n in 0..<I:
for n in 0..<I:
r.incl(s[n.shfl])
r.incl s[n.shfl]
r == x
r == x


Line 1,189: Line 1,189:


template next(state): untyped =
template next(state): untyped =
state.addLast((state[^I]-state[^J]) % M)
state.addLast (state[^I]-state[^J]) % M
discard state.popFirst()
discard state.popFirst()


Line 1,198: Line 1,198:
#reorder and put into ring buffer
#reorder and put into ring buffer
for i in 0..<I:
for i in 0..<I:
result.addLast(s[i.shfl])
result.addLast s[i.shfl]
#cycle through the next 165 values
#cycle through the next 165 values
for _ in 0..<3*I:
for _ in 0..<3*I:
Line 1,214: Line 1,214:
result = proc(): int =
result = proc(): int =
r.next
r.next
return r.peekLast
r.peekLast


let subGen* = initSubGen[55, 24, 34, 1e9.int]
let subGen* = initSubGen[55, 24, 34, 1e9.int]