TL;DR. Это довольно случайно!
Этот пост ничего не находит, а только доказывает, что функция Javascript Math.random() работает очень хорошо, генерируя случайные числа.
Если вам так же любопытно, как и мне, пожалуйста, читайте дальше. Мне стало любопытно, насколько случайной является случайная функция Javascript. Таким образом, я провел исследовательский экспериментальный тест.
Во-первых, давайте определим объект с ключами от 1 до 10 и значениями, равными 0.
results = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0 }
Затем мы определяем функцию, которая генерирует случайное число от 1 до 10.
function generate() { results[Math.ceil(Math.random()*10)] += 1; }
Мы делаем это для миллионов поколений.
for (i = 0; i < 1000000; i++) { generate(); }
и мы получаем это:
results {1: 99692, 2: 100106, 3: 100024, 4: 100196, 5: 100194, 6: 100061, 7: 100093, 8: 99639, 9: 100031, 10: 99964}
Как мы видим, он дает вполне равные значения. Давайте сделаем это еще для 9 миллионов итераций.
for (i = 0; i < 9000000; i++) { generate(); }
и результаты выглядят так же хорошо, как и раньше:
results {1: 999723, 2: 1001311, 3: 999466, 4: 998914, 5: 999135, 6: 1000601, 7: 1000748, 8: 999668, 9: 999537, 10: 1000897}
еще 90 миллионов раз.
for (i = 0; i < 90000000; i++) { generate(); }
Результаты по-прежнему великолепны.
results {1: 9996402, 2: 10002639, 3: 10001977, 4: 9997547, 5: 9997808, 6: 10003280, 7: 10003361, 8: 9999829, 9: 9999667, 10: 9997490}
и даже больше 900 миллионов раз.
for (i = 0; i < 900000000; i++) { generate(); }
Разница в процентах между различными значениями имеет тенденцию исчезать по мере увеличения числа поколений. Хоть я и не проверял разницу в процентах, но, скорее всего, она видна.
results {1: 100009905, 2: 100005439, 3: 99994815, 4: 99987270, 5: 100001693, 6: 100002851, 7: 100003353, 8: 99985621, 9: 100008043, 10: 100001010}
Теперь мы собираемся попробовать это с сотней различных значений.
var results1 = new Uint32Array(100);
Индексация массива начинается с 0, поэтому теперь мы используем Math.floor() вместо Math.ceil(), как раньше.
function generate1() { results1[Math.floor(Math.random()*100)] += 1; }
Затем мы собираемся выполнить миллион поколений этого случайного числа.
for (i = 0; i < 1000000; i++) { generate1(); }
Как мы видим, есть небольшое колебание значений после миллиона поколений.
for (i = 0; i < 99000000; i++) { generate1(); }
И они имеют тенденцию исчезать, когда число поколений стремится к бесконечности. Здесь мы можем увидеть это после 100 миллионов итераций.