硬币翻转 - 返回随机结果

时间:2017-12-05 02:33:05

标签: algorithm math optimization probability

原谅我,如果已经发布了:)我整天都遇到了一个问题,我一直在努力想到一个有效的解决方案。基本上问题是这样的:想象一下你必须翻转一个硬币30亿次并希望在所有这些翻转之后返回头部数量的功能。一个可能的解决方案是明显地制作一个for循环迭代30亿次记录多少个头尾,并返回头部 - 这显然是一个非常低效的解决方案。我想到了二项式概率,但无法看到它可以用来帮助解决这个问题(我可能错过了一些非常明显的事情)。

例如说我输入函数NumberOfHeads(翻转)大部分时间(统计上)它可能会在翻转/ 2周围返回一些数字。但是说flips = 30亿仍然应该有机会(尽管非常小)从来没有)它可能会返回1000个头或什么的。希望我解释说什么让我很烦恼:)感谢任何回应。

1 个答案:

答案 0 :(得分:1)

您可以在此处使用scipy.stats.binom。下面的函数返回每个(bernoulli)试验中随机抽样二项分布的头部数量和公平硬币翻转。

import scipy.stats as scs
def num_heads(num_flips):
    flips = scs.binom(n=num_flips, p=0.5)
    return np.asscalar(flips.rvs(1))

num_heads(3000000000)
# 1499985766

.rvs()此处代表随机变量

在不查看源代码的情况下,我猜猜随机数生成使用的是分析二项式CDF p = CDF(x),取反CDF,然后选择 p < / em>来自~U(0,1)分布。您可以在Downey - ThinkStats - 5.6节中阅读有关该方法的更多信息。披露:我可能完全错了,就像我经常那样。