Это линейный конгруэнтный генератор. Там также должно быть по модулю;
Классическая формула:
seed = (a * seed + b) % m;
В этом случае m
- это просто 2 ^ n, где n - количество бит в seed
(который предположительно имеет тип без знака, так как арифметика по модулю
требуется). Существует обширная литература о том, как выбрать a
, b
и
m
; в общем, согласно справочному документу ( Случайное число
Генераторы: хороших найти трудно , Парк и Миллер, CACM, октябрь.
1988), m
должно быть простым числом, а b
обычно может быть 0; этот
генератор нарушает оба эти правила. (Нарушение первого имеет тенденцию
сделать младшие биты очень неслучайными, что объясняет, почему результаты
сдвинуты.)
Насколько я знаю, единственный способ обеспечить выбор a
и m
хорошо делать обширные статистические тесты, хотя есть способы
выявить некоторые плохие. Для начала a
и m
не должны иметь
общие факторы. (В лучших генераторах оба обычно просты.)
Здесь m
- это степень 2, а добавление единицы к x
делит ее на 2
так что вы более или менее гарантированно получите
не будет очень хорошо.
Для получения дополнительной информации, я бы посоветовал вам прочитать статью.