Я согласен с Джимом Мишелем в том, что xorshift - хороший кандидат на быстрый нешифрующий PRNG. Необходимо тщательно выбирать коэффициенты для достижения полного цикла, который включает в себя все значения, кроме 0.
Поскольку вы задали для проблемы 16 бит в своем вопросе, вот 16-битная реализация, написанная на Ruby, но легко перенесенная на все остальное, что вам нравится:
# << is shift left, >> is shift right, ^ is bitwise XOR, & is bitwise AND
MASK_16 = (1 << 16) - 1
def xorshift(x)
x ^= x << 7 & MASK_16
x ^= x >> 9
x ^= x << 8 & MASK_16
return x
end
counter = 0
x = 1
y = 1
# Floyd's "Tortoise and Hare" cycle-finding algorithm shows
# the generator to be full cycle for 16 bits, excluding zero.
loop do
counter += 1
x = xorshift(x)
y = xorshift(xorshift(y))
break if x == y
end
puts counter # => 65535