打开微信,往一个八人群里发一个九分钱的拼手气红包,那么不管你发多少次,最后一个抢红包的人,都必定能拿到两分钱。不信你可以试试。
显然,在分配红包金额这件事上,你手上的这台小型计算机并不是真随机。
计算机是如何制造随机事件的?各种软件中的随机都是真随机吗?
视频版
↓↓ 看完这个视频就知道了 ↓↓
↑↑ 信我,看完你的手气就会变好 ↑↑
图文版
在计算机中,生成随机事件的关键,是输出一个随机数。然后再利用算法,就能模拟出各式各样的随机事件。
你刚才看到的拼手气红包,背后就有这样一套算法。其中的随机数,就决定了你最后抢到的金额大小。
如何才能得到这样的随机数呢?
1946年,计算机之父冯·诺依曼提出了这么一套方案:
编写一个随机数生成器,只要输入任意一个数字作为种子,计算机就能通过运算,生成一个新的随机数字,然后再把这个数字作为输入值,代入下一轮计算。重复这一过程,就能生成多个具有统计意义的随机数。
直到今天,你的手机、电脑仍然在沿用这套随机数生成方案,只是将随机数生成器升级成了运算效果更好的线性反馈移位寄存器。
随机种子的花样也更多了:从系统时间、鼠标位置,到网络速度、硬盘读写速度,甚至是你聊天记录的本地文件,都可以被拿来当做随机数生成的初始条件,决定最后的随机结果。
这样得到的数字乍看起来非常随机,但受到算法的限制,只要取样范围够大,数字排列早晚会陷入循环。所以这种方式产生的随机数,只能叫做伪随机数。
以常用的梅森旋转算法为例,它生成随机数的循环周期是2的19937次方,哪怕全世界的计算机一起工作,直到太阳系毁灭的那一天,你也等不到这个循环。
但无论循环周期有多长,只要知道一开始的随机种子,再用上同一个的随机数生成器,就能预测随机结果:
比如在1994年,飞利浦的一名员工就弄到了当时的互联网巨头Netscape的服务器随机种子,在输入“当前时间+特定字符”后,他成功解密了对方所有网络服务器的流量信息。
除了能完美预测伪随机结果,你甚至还能主动改变随机种子的数值,让所谓的随机事件,变成100%发生的必然事件。
比如2014年,俄罗斯的一位数学家就拆解了一台旧老虎机,获取了老虎机采用的伪随机算法。然后设计了一套程序,只要用手机拍下其他人的赌博过程,就能反推计算出老虎机所用的随机种子。有了这套方法,你只需要找出对应时间点,拉下拉杆,就能欧神附体、百发百中……
最终被丢出赌场、关进局子。
说到底,虽然伪随机数应用广泛,但它毕竟不是真正的随机数。想要生成无法预测的真随机数,还得从硬件层面想办法。
1999年,英特尔在其i810芯片组上 集成了一枚真随机数生成器。它通过放大电路产生的热噪声,将电路中分子的不规则热运动作为数据来源,这才让计算机拥有了自主生成随机数的能力。
类似地,一些专门提供真随机数服务的公司,还会通过收集现实世界中的随机事件,比如大气噪音的振幅变化,或是人工掷色子、转动轮盘的结果,再把它们转化为二进制或是十进制的数字,以此获得更高品质的随机数资源。
通过这些方式获得的随机数几乎不可能预测,所以被称为真随机数。它们主要应用于安全或密码学领域,用来保护最重要的数据信息。
不过,如果硬要抬杠,那么这种真随机数其实也不够随机。
因为宏观现实世界里的一切随机现象,仍然遵循物理学的必然规律,只是我们这些凡人无法参透罢了。如果拉普拉斯妖真的存在,那么理论上,它就能知晓所有原子的分布和动量,算出任何色子的点数,破解一切加密的信息。
如果想要实现绝对的随机,那就只能求助于量子力学了。
随着技术发展,如今的研究人员已经能通过记录元素的衰变和放射情况,或是探测真空中亚原子的噪音,或者统计出纠缠粒子出现的随机位,设计出更新型的随机数生成器。
在现有科学体系下,这种方式产生的数字没有规律,在物理和哲学层面上都绝对不可预测,是真正意义上的随机数。
不过回归现实,用量子力学生成随机数,技术难度实在太高;用芯片自带的真随机数生成器,输出效率又太低。你手上这台计算机现在用的,其实还是伪随机数。
而且,有时候过于随机也不一定是件好事,如果没有软件算法为用户把控恰当好处的随机感,而是直接让这些随机数来决定结果,那么你很可能在听音乐时连续三次都听到同一首曲子,抢红包时每一次都是手气最差,玩游戏时连抽一百张卡都没有SSR。
延伸阅读
————
点击下图观看更多柴柴讲解视频哦!