Как случайность достигается с помощью Math.random в javascript?

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

Ответ 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);