【问题标题】:Coin flipping - returning random outcome硬币翻转 - 返回随机结果
【发布时间】:2018-11-25 05:17:36
【问题描述】:

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

例如说我在函数 NumberOfHeads(flips) 中输入大多数时间(统计上)它可能会返回一些大约翻转 / 2 的数字。但是说翻转 = 30 亿应该仍然有机会(尽管非常苗条到从不)它可能会返回 1000 个正面或其他东西。希望我能很好地解释困扰我的问题 :) 感谢您的回复。

【问题讨论】:

  • 这将是一个概率问题 - 计算 1 个正面、2 个正面、3 个正面......等的概率,然后使用这些概率并在它们之间随机选择一次。查找更简单问题的概率,例如 10 次翻转,然后使用该格式计算 n 翻转的概率列表。得到概率列表后,就像掷骰子一样,边数不同,权重不同。
  • 对于 30 亿次翻转这样的数字,您可以使用 gaussian approximation
  • 抱歉,不清楚。我知道如何计算概率,这不是我要的。我想要一些函数,它会在一定数量的翻转中返回正面数量的随机输出。例如 NumberOfHeads(10) 或 10 次翻转大多会返回 4 到 6,但也有可能返回 0。
  • 我不想模拟所有 30 亿次翻转(正如我提到的那样效率低下),也许是一些最有可能返回标准偏差范围内的数字的数学函数。
  • 你仍然会使用高斯近似。

标签: algorithm math optimization probability


【解决方案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() 这里代表随机变量

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-21
    • 2018-12-30
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多