抛硬币 - 返回随机结果

Coin flipping - returning random outcome

如果这已经发布了,请原谅我 :) 我整天都有一个问题困扰着我,我一直在努力想出一个有效的解决方案。基本上问题是这样的:假设你必须抛硬币 30 亿次,并且想要一个函数 returns 在所有这些翻转之后的正面数量。一种可能的解决方案显然是使 for 循环迭代 30 亿次,记录正面和反面的数量并 returning 正面 - 这显然是一个非常低效的解决方案。我想到了二项式概率,但看不出这可以帮助解决这个问题(我可能遗漏了一些非常明显的东西)。

例如,假设我在函数 NumberOfHeads(flips) 中输入大多数时间(统计),它可能 return 一些围绕 flips / 2 的数字。但是说 flips = 30 亿,应该仍然有机会那(虽然难以置信地苗条到永远不会)它可能 return 1000 头或其他东西。希望我能充分解释困扰我的问题 :) 感谢您的任何回复。

你可以在这里使用 scipy.stats.binom。下面的函数 returns 来自随机抽样的二项式分布的正面数量,在每次(伯努利)试验中均掷硬币。

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 来自 ~U(0,1) 分布。您可以在 Downey - ThinkStats - 第 5.6 节中阅读有关该方法的更多信息。披露:我可能完全错了,就像我经常犯的那样。