03:07 

Заболекарь
Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Наштовхнувся нещодавно на обговорення коду на кшталт random()+random()+random(). Деякі коментатори гигикали: «один random() комусь недостатньо випадковий, треба більше випадковості».

Невтямки їм було, що сума незалежних випадкових величин розподілена як згортка (англ. convolution) їхніх розподілів. Якщо random() генерує випадкові значення, розподілені рівномірно, то сума декількох таких значень буде розподілена вже зовсім інакше. Справді:

import numpy as np
import matplotlib.pyplot as plt

x1, x2, x3 = [np.random.random(size=500000) for __ in range(3)]
plt.style.use('bmh')

plt.hist(x1, bins=50, normed=True)

зображення

plt.hist(x1+x2, bins=50, normed=True)

зображення

plt.hist(x1+x2+x3, bins=50, normed=True)



зображення

Розподіл суми ен незалежних випадкових величин, кожна з яких має рівномірний розподіл, зветься розподілом Ірвіна-Гола (англ. Irwin-Hall distribution). Чим більше ен, тим сильніше цей розподіл нагадує Ґаусів дзвін. Можливо, саме цього автор коду й хотів досягти (хоча дарма він цього ніяк не відобразив у коментарях або в іменах змінних).

@темы: root@глупыйпингвин:~#, to err is human to arr is pirate, $a_{i,\sigma(i)}$

URL
Комментарии
2016-09-01 в 06:45 

sanitareugen
"На кота широко - на собаку узко". Сумма трёх равномерных слишком далека от нормального; когда такой способ был в моде (а связано это было с тем, что на тогдашних машинах функции считались не медленно, а очень медленно, и какой-нибудь Бокс-Мюллер с синусом и логарифмом делался за недопустимое число операций, тогда как на вычисление равномерного СЧ уходило одно умножение), брали 12 слагаемых, и то, приходилось дошлифовывать нелинейным преобразованием (поправкой Тейчроева).
Надо смотреть, для чего используется - если нужно нормальное, то есть дающие куда более близкое к нормальному за меньшее число операций, но может быть, автор действительно ожидает равномерного. Вариант, что нужно распределение Ирвина-Холла при n=3 интересен, но невероятен

f_X(x)= \begin{cases}
\frac{1}{2}x^2 & 0\le x \le 1\\
\frac{1}{2}\left(-2x^2 + 6x - 3 \right)& 1\le x \le 2\\
\frac{1}{2}\left(x^2 - 6x +9 \right) & 2\le x \le 3
\end{cases}

2016-09-01 в 07:40 

Заболекарь
Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Спасибо за экскурс в историю, интересно.

Если автор ожидал, скажем, равномерного от 0 до 3, то он выбрал странный способ вместо хотя бы 3*random(). Возможно, нужно было просто что-то приблизительно колоколообразное. Кто теперь узнает.

URL
2016-09-01 в 08:33 

sanitareugen
А по тексту программы не понять? Или там только это выражение процитировано?
Вообще же - для таких сумм хорошо семиинварианты работают. Легко оценить степень приближения к нормальному.

2016-09-01 в 13:35 

Заболекарь
Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Контекста там не было.

Пойду почитаю.

URL
   

Эх, разум, да ещё разум

главная