Я надеюсь реализовать простой генератор псевдослучайных чисел (PRNG), который имеет указанный период и гарантирует отсутствие коллизий в течение этого периода. После некоторого исследования я наткнулся на очень известный LCG, который идеально подходит. Проблема в том, что у меня проблемы с пониманием того, как правильно его настроить. Вот моя текущая реализация:
function LCG (state)
{
var a = ?;
var c = ?;
var m = ?;
return (a * state + c) % m;
}
В нем говорится, что для того, чтобы иметь полный период для всех начальных значений, должны быть выполнены следующие условия:
- c и m относительно простые
- a-1 делится на все простые множители м
- a-1 кратно 4, если m кратно 4
1 и 3 просты для понимания и проверки. Однако насчет 2, я не совсем понимаю, что это значит или как это проверить. А как насчет C, это может быть ноль? что если оно ненулевое?
В целом мне нужно выбрать A, C и M таким образом, чтобы у меня был период 48 ^ 5 - 1. М равен периоду, я не уверен насчет А и С.