最硬核的技术博客,使用代码展示一下,出乎人们常识的“不可能”。
大家在生活领域,历史领域,教育领域,艺术领域,
从不同角度口述了一些不可能发生的事。
科技领域,通过代码,让事实说话
硬币问题
概率论,是来自上帝的学问。
经典概率模型中,有一个共同特点:
1 – 试验的样本空间只包含有限个元素;
2 – 试验中每个基本事件发生的可能性相同。
抛硬币问题,就是一个经典的等可能概型。
每一次抛掷硬币,要么正面,要么反面,且正反面出现的机会均等。
更均等的随机函数
大家下面示例,将会使用PHP实现,随机函数使用mt_rand。它可以更好更快地生成随机数。
为了检验其随机性,大家使用一个检测的测试用例,测试一下。代码如下:
经过10^8次方运算,也就是一亿次循环,得到结果如下:
zero = 50005017,[50.005016]; one = 49994984,[49.994984].
zero = 49999797,[49.999797]; one = 50000204,[50.000203].
zero = 50004411,[50.004410]; one = 49995590,[49.995590].
zero = 50003164,[50.003163]; one = 49996837,[49.996837].
zero = 49999658,[49.999658]; one = 50000343,[50.000342].
zero = 50002590,[50.002589]; one = 49997411,[49.997411].
在命令行多终端同时运行,所得结果如上。可见出现0/1的机会均等。
三枚硬币
大家扩展开来说,依次抛出三枚硬币,所得的正反情况。
每一组所得的结果,无外乎下面这几种情况:
0 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 1
一共八种情况。
老规矩,运行一亿次,看代码和结果。
各种情况概率很平均,没有明显偏差,这与预期相符。
同样地,一次抛出3枚硬币,所得概率基本相同,代码如下:
结果一样,遵循均等分布。
来玩一把游戏
那么,重点来了,如果大家两个人约定,
依次抛一枚硬币,
遇到 正反反,你给偶一元;
遇到 反反正,偶给你一元;
一起玩儿吗?
本着程序员该有的懒惰,大家使用程序快速模拟这个过程,看看机会是否均等。
如果机会均等,这就拼的是个人运气,无所谓,一切都是天注定,赢了输了认命。
其实这段代码,偶分别使用了10轮,100轮,1000轮,以至一百万轮的结果。
基本印证了一个结果:
上述规则,出现正反反的次数,基本是反反正次数的3倍。
这个游戏是偏离直觉认识的,是不公平的。
不公平之处,就在于前提规则,打断了随机过程。
因为每轮出现正反反,或反反正,立即退出,重新洗牌。
两句多余的话
不要相信直觉,在判断一个规则是否公平之前,还是做好调查、模拟、计算。
直觉,有时候,真的不可信。
如果觉得《你认为不可能发生的事情有哪些 – PHP基础 – 前端 php获取用户访问》对你有帮助,请点赞、收藏,并留下你的观点哦!