Как случайность достигается с Math.random в JavaScript?

Как случайность достигается с Math.random в JavaScript? Я сделал что-то, что выбирает приблизительно между 50 различными вариантами случайным образом. Я задаюсь вопросом, насколько удобный я должен быть с использованием Math.random для получения моей случайности.

18
задан ЯegDwight 4 March 2010 в 15:59
поделиться

5 ответов

Из спецификаций:

random ():

Возвращает числовое значение с положительным знаком , большим или равным 0, но меньше 1, выбранным случайным образом или псевдо случайным образом с приблизительно равномерным распределением в этом диапазоне с использованием алгоритма, зависящего от реализации, или стратегии . Эта функция не принимает аргументов .

Ответ таков: это зависит от того, какой движок JavaScript вы используете.

Я не уверен, что все браузеры используют одну и ту же стратегию или, к сожалению, что это за стратегия.

Это должно подойти для ваших целей. Только если вы набираете большое количество чисел, вы начнете видеть шаблон

14
ответ дан 30 November 2019 в 07:55
поделиться

Точная реализация, конечно, может несколько отличаться в зависимости от браузера, но все они используют какой-то генератор псевдослучайных чисел. Хотя это не совсем случайно, но, безусловно, достаточно для всех общих целей.

Беспокойство о случайности следует беспокоить только в том случае, если вы используете ее для чего-то, что требует исключительно хорошей случайности, например, для шифрования или моделирования азартной игры на деньги, но в любом случае вы вряд ли будете использовать Javascript.

3
ответ дан 30 November 2019 в 07:55
поделиться

Это немного перебор ... но я не мог устоять перед этим :)

Вы можете выполнить это в адресной строке браузера. Он генерирует случайное число от 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);
1
ответ дан 30 November 2019 в 07:55
поделиться

Это 100% случайность, достаточная для ваших целей. Он засеивается по времени, поэтому каждый раз, когда вы его запускаете, вы будете получать разные результаты.

Вставьте это в адресную строку вашего браузера...

javascript:alert(Math.random() * 2 > 1);

и нажмите [Enter] несколько раз... Я получил "true, false, false, true" - достаточно случайный результат :)

2
ответ дан 30 November 2019 в 07:55
поделиться

Использование 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 () из метки времени, как упоминалось в одном из других плакатов.

11
ответ дан 30 November 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: