Хороший способ понять, как вероятности возникают из случайных процессов, закодированных на нашем любимом языке.
В недавней статье Эрик Клеппен исследовал так называемый «парадокс дня рождения», моделируя и визуализируя распределения дней рождения, и все это на Python. Как энтузиаст JavaScript, я не мог не использовать эту идею для веб-браузера.
Парадокс дня рождения представляет собой парадоксальный факт, что не так уж маловероятно найти двух людей, у которых один день рождения, даже в небольшой группе…
Как показал пример Эрика, в группе всего из 23 человек вероятность того, что у кого-то общий день рождения, составляет около 50%, согласно аналитической формуле, которую можно вывести из биномиальных распределений. Более того, в группе из 70 человек вероятность того, что двое из них родятся в один день, составляет 99,9%!
Моделирование, а не вывод уравнений
Если аналитическая математика вас не убеждает, то лучше всего просто смоделировать примеры… много, много, много примеров, а затем собрать частоты.
Здесь я сделал это (с примером из 23 человек) очень легко, просто в Excel. Конечно, это плохо масштабируется, поэтому в следующий раз мы сделаем это на JavaScript. Но давайте сначала посмотрим на электронную таблицу, чтобы понять суть протокола.
По сути, мы выполняем следующий «симуляционный эксперимент» несколько раз:
- Моделирование 23 целых чисел от 1 до 365 (строки со 2 по 24)
- Проверьте, повторяются ли какие-либо два числа (строки с 27 по 50), присвоив 1, если верно, или 0 в противном случае.
Наконец, мы просто суммируем единицы по всем реализациям эксперимента и делим на количество реализаций. для простоты, поскольку мы решили присвоить 1 и 0, это соответствует среднему значению всех вычисленных 0 и 1. Это число является результатом, который мы ищем.
Например, здесь я провел 192 эксперимента (каждый эксперимент — это один столбец), вытягивая 23 случайных числа от 1 до 365 (каждая строка от 2 до 24 — это одно из этих случайных чисел). Вы видите, что среднее значение равно 0,52, что довольно близко к полученному аналитически значению около 0,5.

Моделирование 23 дней рождения в JavaScript
Смоделировать 23 дня рождения и проверить, разделяют ли их хотя бы два человека в JavaScript, очень просто:
<script>
var birthdays=[] //Array that will contain the birthdays
//A function to generate the birthdays
function generatebirthdays() {
birthdays=[] //Clear array
for (var i=0;i<23;i++) //Push 23 random numbers
{birthdays.push(parseInt(Math.random()*365+1))}
}
//A function to print the birthdays
function printbirthdays() {
for (var i=0;i<23;i++) {+
((typeof(s)=="undefined")?"":";s"+s.width+"*"+s.height+"*"+
(s.colorDepth?s.colorDepth:s.pixelDepth))+";u"+escape(d.URL)+
";h"+escape(d.title.substring(0,150))+";"+Math.random()})