В языке есть генератор случайных чисел не привязанный к какому-либо параметру, а надо сделать наоборот.
Сверх сложный не надо, но и совсем простой тоже было бы не желательно.
Ответ
Классический линейный конгруэнтный метод может стать приемлемым решением, если нет требований к криптостойкости.
С учетом специфики 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
int main() {
std::minstd_rand g(1);
for (int i = 0; i < 1000; ++i)
std::cout << g() << std::endl;
}
Ссылка на действующий C++ код. Оба варианта дают в конце последовательности из 1000 итераций одинаковый результат:
... 390639274, 1641974594, 429183498
Как ограничить результат по диапазону, думаю, вы знаете.
Комментариев нет:
Отправить комментарий