Как случайность достигается с Math.random в JavaScript? Я сделал что-то, что выбирает приблизительно между 50 различными вариантами случайным образом. Я задаюсь вопросом, насколько удобный я должен быть с использованием Math.random для получения моей случайности.
Из спецификаций:
random ():
Возвращает числовое значение с положительным знаком , большим или равным 0, но меньше 1, выбранным случайным образом или псевдо случайным образом с приблизительно равномерным распределением в этом диапазоне с использованием алгоритма, зависящего от реализации, или стратегии . Эта функция не принимает аргументов .
Ответ таков: это зависит от того, какой движок JavaScript вы используете.
Я не уверен, что все браузеры используют одну и ту же стратегию или, к сожалению, что это за стратегия.
Это должно подойти для ваших целей. Только если вы набираете большое количество чисел, вы начнете видеть шаблон
Точная реализация, конечно, может несколько отличаться в зависимости от браузера, но все они используют какой-то генератор псевдослучайных чисел. Хотя это не совсем случайно, но, безусловно, достаточно для всех общих целей.
Беспокойство о случайности следует беспокоить только в том случае, если вы используете ее для чего-то, что требует исключительно хорошей случайности, например, для шифрования или моделирования азартной игры на деньги, но в любом случае вы вряд ли будете использовать Javascript.
Это немного перебор ... но я не мог устоять перед этим :)
Вы можете выполнить это в адресной строке браузера. Он генерирует случайное число от 0 до 4, 100000 раз. И выводит, сколько раз было сгенерировано каждое число и сколько раз одно случайное число следовало за другим.
Я выполнил это в Firefox 3.5.2. Все числа кажутся примерно равными, что указывает на отсутствие предвзятости и очевидной закономерности в том, как числа генерируются.
javascript:
var max = 5;
var transitions = new Array(max);
var frequency = new Array(max);
for (var i = 0; i < max; i++)
{
transitions[i] = new Array(max);
}
var old = 0, curr = 0;
for (var i = 0; i < 100000; i++)
{
curr = Math.floor(Math.random()*max);
if (frequency[curr] === undefined)
{
frequency[curr] = -1;
}
frequency[curr] += 1;
if (transitions[old][curr] === undefined)
{
transitions[old][curr] = -1;
}
transitions[old][curr] += 1;
old = curr;
}
alert(frequency);
alert(transitions);
Это 100% случайность, достаточная для ваших целей. Он засеивается по времени, поэтому каждый раз, когда вы его запускаете, вы будете получать разные результаты.
Вставьте это в адресную строку вашего браузера...
javascript:alert(Math.random() * 2 > 1);
и нажмите [Enter] несколько раз... Я получил "true, false, false, true" - достаточно случайный результат :)
Использование Math.random () нормально, если вы не объединяете и не используете результаты централизованно, то есть для OAuth.
Например, наш сайт использовал Math.random () для генерации случайных строк nonce для использования с OAuth. Исходная библиотека JavaScript сделала это, выбрав символ из заранее определенного списка с помощью Math.random (): т.е.
for (var i = 0; i < length; ++i) {
var rnum = Math.floor(Math.random() * chars.length);
result += chars.substring(rnum, rnum+1);
}
Проблема в том, что пользователи получали повторяющиеся строки nonce (даже при использовании длины 10 символов - теоретически ~ 10 ^ 18 комбинаций), обычно в пределах нескольких секунд друг от друга. Я предполагаю, что это связано с заполнением Math.random () из метки времени, как упоминалось в одном из других плакатов.