#python-3.x #numpy
#python-3.x #numpy
Вопрос:
Я пытаюсь использовать функцию np.random.binomial () для имитации нескольких подбрасываний монет со следующими заданными параметрами:
- Количество монет = 10
- Количество переворотов на монету = 1
- Вероятность выпадения головы P (H) = 0,5 «т.е. честная монета»
- Количество попыток = 1000 000
Для получения результата я использовал следующий код:
[КОД]
%%time
tests = np.random.binomial(n=1, p=0.5, size=(int(1e6), 10))
test_sums = tests.sum(axis=1) # axis=1 to sum each row
(test_sums == 4).mean()
[ВЫВОД]
(Wall time: 248 ms)
0.204992
Один из моих товарищей по команде рекомендовал следующий фрагмент, который использует меньше кода и кажется более эффективным:
[КОД]
%%time
tests = np.random.binomial(n=10, p=0.5, size=int(1e6))
(tests == 4).mean()
[ВЫВОД]
Wall time: 68.9 ms
0.2048
Когда я могу использовать любой из следующих:
tests = np.random.binomial(n=1, p=0.5, size=(int(1e6), 10))
tests = np.random.binomial(n=10, p=0.5, size=int(1e6))
Не могли бы вы, пожалуйста, посоветовать, в чем разница между этими двумя случаями? Зная это, результат, можно сказать, тот же.
Ответ №1:
Версия, рекомендованная вашим товарищем по команде, более эффективна и математически эквивалентна. Указание n=10
указывает binomial
подбросить монету 10 раз и вернуть количество «успехов» (которые вы можете определить как «головы»). Другими словами, она выполняет то же, что и ваш код, но за один вызов функции.