利用计算机解决抛硬币问题

【这是 Rain City 的第 6 篇文章。】

之前在知乎上看到一个问题(一枚硬币,扔了一亿次都是正面朝上,再扔一次反面朝上的概率是多少?):

一枚硬币,扔了3次都是正面朝上,再扔一次反面朝上的概率是多少?

一枚硬币,扔了10次都是正面朝上,再扔一次反面朝上的概率是多少?

一枚硬币,扔了100次都是正面朝上,再扔一次反面朝上的概率是多少?

一枚硬币,扔了10000次都是正面朝上,再扔一次反面朝上的概率是多少?

如果扔一亿次就有理由相信这是一枚两面都是正面的硬币,那么扔2次有理由吗?扔10次有理由吗?

具体从第几次开始我们就可以有理由相信这是一枚两面都是正面的硬币?

如果第一亿零一次投出反面,那么第一亿零二次投出正反面的概率各为多少?

初步解答

问题看似复杂,实际上解答十分简单。

因为每扔一次硬币,可能出现的情况数量都是上一次的2倍(硬币共2面),所以扔n次可能出现种等可能结果。

如果这是一枚两面都是正面的硬币,那么无论扔多少次连续正面朝上的概率都是1,即扔n次连续正面朝上有种情况。

如果这是一枚普通硬币,那么我们可以知道扔n次连续正面朝上只有1种情况。

假设一枚硬币连续扔n次硬币都是正面朝上,那么这是一枚两面都是正面的硬币的概率为,这是一枚普通硬币的概率为

因为扔一枚普通硬币反面朝上的概率为,所以一枚硬币连续扔n次都是正面朝上,那么第n+1次是反面朝上的概率为

通过上面的公式,我们可以计算出连续抛n次都是正面朝上,那么这是一枚两面都是正面的硬币的概率表。

我们可以看到,当连续扔30次都是正面朝上时,这是一枚两面都是正面的概率已经达到了0.999999999,如果继续往下计算,因为小数位数的限制,计算机已经约算为1了。

使用计算机验证

(这一段内容基本是水的……不想看就直接跳过吧)

这时候用上我写程序的额外技能,用一个Java程序来模拟抛硬币。

程序逻辑:从第1次抛硬币开始,在第n次抛硬币中产生一个随机布尔值(实际上是伪随机),如果这个随机布尔值为true,则给连续抛n次硬币正面朝上的次数加1,并继续第n+1次抛硬币,直到抛出false结束。将这个过程循环执行指定的次数,得出普通硬币的数据。因为特殊硬币正面朝上的概率必定为1,所以这里无需模拟。

既然罗曼诺夫斯基也只抛了8万次硬币,那我先来用程序模拟抛普通硬币10万次。

可以看到,在共100000次的模拟中,没有一枚硬币连续18次抛出正面。

我们继续扩大模拟数量。

100万次模拟数据:

1000万次模拟数据:

最后是1亿次模拟数据:

程序的运算速度非常快,1亿次的模拟不到半分钟就算完了。

从图表中我们可以看到,2亿次模拟得到的数据已经十分接近算术值了。

同时我们观察图表可知,概率呈指数上升,并且在第10次时已经十分接近1。

(好的终于水完了)


因此,

一枚硬币,扔了3次都是正面朝上,再扔一次反面朝上的概率是

一枚硬币,扔了10次都是正面朝上,再扔一次反面朝上的概率是

一枚硬币,扔了100次都是正面朝上,再扔一次反面朝上的概率是

一枚硬币,扔了10000次都是正面朝上,再扔一次反面朝上的概率是

如果一亿零一次投出反面,那么第一亿零二次投出正面的概率为,投出反面的概率为

根据上面得到的结论可知,若n+1次抛硬币全部抛出正面,则在第n+1次时这是一枚特殊硬币的确定性增加

同理,这是一枚特殊硬币的概率只能无限逼近1,即严格来说,从第次开始我们才可以有理由相信这是一枚两面都是正面的硬币。

如果扔一亿次后,这是一枚特殊硬币的确定性是1,显然这个确定性要比上面的数据要大,即扔2次的确定性大于80%,扔10次的确定性大于0.99902439%。

至于这个“有理由相信这是一枚两面都是正面的硬币”的标准是什么,需要根据个人标准来判断。

顺便发上程序代码:https://github.com/Fidelxyz/Toss-coins

此文章同时在知乎发布:一枚硬币,扔了一亿次都是正面朝上,再扔一次反面朝上的概率是多少? - 玄云Fidel的回答 - 知乎