打开微信,给8人小组发9美分手工红包。 那么,不管发多少次,抢最后一个红包的人一定能拿到2美分。 如果你不相信,你可以试试。 很明显,通过分配红包金额,你手里的这台小型计算机真的很不随机。 计算机是如何制造随机事件的? 各软件的随机真的是随机的吗?
用计算机生成随机事件的关键是输出随机数,可以通过重用算法来模拟各种随机事件。 我刚才看到的红包背后有这样的算法。 其中的随机数决定了你最后夺走的金额的大小。 怎样才能得到这样的随机数?
1946年,冯诺伊曼提出了一种方案,即制作随机数生成器,只需输入任意数字作为种子,计算机就可以通过运算生成新的随机数字。 然后,如果将这个数字作为输入值带入下一个计算中,通过重复这个过程,就可以生成多个有统计意义的随机数。
即使今天,你的手机电脑依然沿用这个随机数生成方案,只是把随机数生成器升级到了运算效果更好的线性反馈移位寄存器。 随机种子的图案也增加了。 从系统时间、鼠标的位置到网络速度、硬盘的读写速度、甚至聊天记录的本地文件,可以作为随机数生成的初始条件使用,决定最后的随机结果。 这样得到的数字,乍一看很随机。 然而,受到算法的限制,如果采样范围足够大,数字序列终将陷入循环。 因此,用这种方式生成的随机数只能称为伪随机数。
以常用的梅森旋转算法为例,生成随机数的循环周期为2的19937次幂。 即使全世界的计算机一起工作,也等不到这个周期,直到太阳系被破坏的那一天。 但是,即使周期再长,如果知道最初的随机种子,使用相同的随机数生成器,也能够预测随机结果。
例如,1994年,飞利浦的一名员工获得了当时互联网巨头Netscape服务器的随机种子,在当前时间添加特定字符后,成功解密了对方所有网络服务器的流量信息。
不仅可以完美预测伪随机结果,而且可以积极改变随机种子的数值,使其成为所谓随机事件100%发生的必然事件。
例如2014年,俄罗斯一位数学家将旧的老虎机进行分解,得到了老虎机采用的伪随机算法,设计了一个程序,只要用手机拍摄别人的赌博过程,就可以倒算出老虎机使用的随机种子有了这个方法,只要找到对应的时间点降低杠杆,欧神就会投靠,百发百中。 终于被扔出赌场,被关进局里。
毕竟,虽然伪随机数被广泛使用,但它毕竟不是真随机数,要生成不可预测的真随机数,必须在硬件级别采取措施。 1999年,英特尔在其i810芯片组上集成了真正的随机数生成器。 放大电路产生的热噪声,以电路中分子的不规则热运动作为数据源,使计算机具有自主生成随机数的能力。 一些专门提供真正随机数服务的公司收集现实世界的随机事件,例如大气噪声的振幅变化和人工掷骰子转轮盘的结果。 通过将它们转换为二进制或十进制数字,获得更高质量的随机数资源。 用这些方法得到的随机数几乎无法预测,所以称为真随机数。 他们主要用于安全和密码学领域,用于保护最重要的数据信息。
但是,如果硬拿起来,这样的真随机数实际上不是随机的。 因为宏观现实世界中的一切随机现象仍然遵循物理学的必然规律。 只是,像我们这样的凡人不能参加。 如果拉普拉斯恶魔真的存在,理论上你可以知道所有原子的分布和动量,计算出哪个粒子的点数,解读所有加密的信息。 要实现绝对的随机,只能依靠量子力学。
随着技术的发展,现在的研究者可以通过记录元素的衰变和辐射情况,检测真空中氩原子的噪声,统计出现纠缠粒子的随机位,来设计新的随机数发生器。
在现有的科学体系下,这样生成的数字没有规律,是物理上和哲学上绝对无法预测的、真正意义上的随机数。 但是回到现实,用量子力学生成随机数的技术难度太大了,对于芯片上的真正的随机数生成器来说,输出效率太低了。
你手上的这台计算机我现在在用,其实是后续基数。 另外,有时太随机了,未必是好事。 如果没有给用户带来恰到好处的随机感的软件算法,就让这些随机数直接决定结果。 你在听音乐的时候,很可能连续三次听到同一首曲子。 抢红包的时候,每次手气都最差。 玩游戏的时候抽100张卡也没有SSR。 说白了,你感受到的随机不是命运的恶作剧,只是算法被提前安排好了。