原谅我,如果已经发布了:)我整天都遇到了一个问题,我一直在努力想到一个有效的解决方案。基本上问题是这样的:想象一下你必须翻转一个硬币30亿次并希望在所有这些翻转之后返回头部数量的功能。一个可能的解决方案是明显地制作一个for循环迭代30亿次记录多少个头尾,并返回头部 - 这显然是一个非常低效的解决方案。我想到了二项式概率,但无法看到它可以用来帮助解决这个问题(我可能错过了一些非常明显的事情)。
例如说我输入函数NumberOfHeads(翻转)大部分时间(统计上)它可能会在翻转/ 2周围返回一些数字。但是说flips = 30亿仍然应该有机会(尽管非常小)从来没有)它可能会返回1000个头或什么的。希望我解释说什么让我很烦恼:)感谢任何回应。
答案 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节中阅读有关该方法的更多信息。披露:我可能完全错了,就像我经常那样。