Страницы

Поиск по вопросам

четверг, 30 мая 2019 г.

Алгоритм ГСЧ генерирующий одинаковые числовые последовательности при одинаковом Seed [закрыт]

В языке есть генератор случайных чисел не привязанный к какому-либо параметру, а надо сделать наоборот.
Сверх сложный не надо, но и совсем простой тоже было бы не желательно.


Ответ

Классический линейный конгруэнтный метод может стать приемлемым решением, если нет требований к криптостойкости.
С учетом специфики JavaScript, проще взять параметры генератора, используемые в стандартной функции minstd_rand из c++11
multiplier = 48271 increment = 0 modulus = 2147483647
В случае умножения multiplier (48271) на максимальное значение seed (2147483646), получается 103661183076066, что меньше максимально возможного безопасного целого числа в JavaScript 9007199254740991
var Random = function(seed) { seed = (seed || 1) % 2147483647; return { next: function() { return seed = seed * 48271 % 2147483647; }, seed: function(s) { seed = s; } }; }; var random = new Random(1); for (var i = 0; i < 1000; i = i + 1) { console.log(random.next()); }
Для сверки результатов можно использовать код на c++11
#include #include
int main() { std::minstd_rand g(1); for (int i = 0; i < 1000; ++i) std::cout << g() << std::endl; }
Ссылка на действующий C++ код. Оба варианта дают в конце последовательности из 1000 итераций одинаковый результат:
... 390639274, 1641974594, 429183498
Как ограничить результат по диапазону, думаю, вы знаете.

Комментариев нет:

Отправить комментарий