Как достигается случайность с помощью Math.random в javascript? Я сделал что-то, что выбирает между 50 различными вариантами случайным образом. Мне интересно, как мне комфортно пользоваться Math.random, чтобы получить мою случайность.
Как случайность достигается с помощью Math.random в javascript?
Ответ 1
Из спецификаций:
случайным образом():
Возвращает значение числа с положительным знак, больше или равно 0, но менее 1, выбранных случайным образом или псевдо случайным образом с приблизительно однородным распределения по этому диапазону, используя зависящий от реализации алгоритм или стратегия. Эта функция не принимает Аргументы.
Итак, ответ заключается в том, что это зависит от того, какой движок JavaScript вы используете.
Я не уверен, что все браузеры используют ту же стратегию или что эта стратегия, к сожалению,
Это должно быть хорошо для ваших целей. Только если вы делаете большое количество чисел, вы начнете видеть шаблон
Ответ 2
Использование Math.random() отлично, если вы не собираете централизованно и не используете результаты, т.е. для OAuth.
Например, наш сайт использовал Math.random() для генерации случайных строк "nonce" для использования с OAuth. Оригинальная библиотека JavaScript сделала это, выбирая символ из предопределенного списка, используя Math.random(): i.e.
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() из временной метки, как упоминалось в одном из других плакатов.
Ответ 3
Точная реализация может, конечно, несколько отличаться в зависимости от браузера, но все они используют какой-то генератор псевдослучайных чисел. Хотя это не очень случайный, он, безусловно, достаточно хорош для всех общих целей.
Вам следует беспокоиться только о случайности, если вы используете его для чего-то, что требует исключительно хорошей случайности, например, для шифрования или моделирования случайной игры в игре за деньги, но в любом случае вы вряд ли будете использовать Javascript.
Ответ 4
Это 100% случайным образом для ваших целей. Он посеял по времени, поэтому каждый раз, когда вы его запускаете, вы получите разные результаты.
Вставьте это в адресную строку браузера...
javascript:alert(Math.random() * 2 > 1);
и несколько раз нажмите [Enter]... Я получил "true, false, false, true" - достаточно случайный:)
Ответ 5
Это немного перебор... но я не мог удержаться от этого:)
Вы можете выполнить это в адресной строке браузера. Он генерирует случайное число от 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);