随机数随机吗?

想法 · 2021-12-27

魔术师在变魔术时经常会让观众心里随便想一个或说一个数字出来,这个数字在我们看来就是一个随机数,因为包括我们自己在内的所有人在说出来之前都不知道会是个什么数。

那么随机数具备什么特征才叫随机数呢?比如随机从1-10区间选一个整数,那应该有以下要求

  • 在可选范围内每个数都有机会被选到,并且概率在统计学上应该是相同的,比如一个人如果比较痛恨4这个数,那从来不选,那不行;他比较喜欢8,那每选3个数时总有1个8也不行。

对于人来说,说一个随机数应该很简单,可能因为我们不能预估我们的想法,也可能是因为我们的脑回路太复杂,我们控制不了。转而到对于计算机来说就不简单了,计算机是要求按程序严格执行的,本身就有可重复运行的性质,是典型的一根筋,不可能产生任何随机『想法』。计算机就好像是捡了几个石块,只能执行2块石头加3块石头等于5块石头,你要想让石头堆自己随机蹦出几个来是不可能的。

但是我们用到的软件上经常会有『随机』的东西,比如登录时的验证码、游戏里打怪的掉血量之类的,那计算机是自己『想』出来一个随机数的呢?

刚才说了计算机都是一根筋,就是输入1+1就会输出2,如果需要一个『随机』数的话,那就需要给它一个随机数,比如输入[1+1, 12345],那就返回[2, 12345+n]这样的,1+1是一个算式,可以算出2,12345如果本身就是一个随机数的话,那可以认为12345+n也是个随机数,这样实际上就输出了一个随机数,所以如果我们能先生成一个随机数给计算机,它就有可能生成另一个随机数给我,那这时就产生一个问题:

  • 我们怎么先生成一个随机数先传给程序?
  • 我们每次只能传进去有限数量的随机数,怎么能在运行过程中再拿到『无数』个『随机』数?

首先解决我们传给计算机的随机数,肯定是不能让另一台计算机生成一个,否则这就是套娃了,那既然不能自动生成,最简单的当然是计算机执行前人为输入一个,这个是最简单的,不过会有些问题:人为输入不能保证数据足够散列,比如上面提到的有人就是不喜欢4,喜欢8,每次运行他就输入8,那就不够随机。那什么可以呢?比较常用的是时间,时间是不停在变化的,精确到毫秒级的数字人为基本不可控,选用计算机开始执行的时间点作为初始随机数是一个好办法,这个初始值也叫种子,有了这个种子值,那之后的随机数就可以通过算法算出来,比如如果X是初始随机数,A、B、C都是常数的话,通过以下方法算出来一个随机数

$$ (A*X+B)mod C $$ 之后对X进行+1,再继续算进行下一个随机数,然后我们就可以拿到无数随机数,这个时候算随机数的算法就需要更侧重于散列程度,因为X每次只是进行+1这种变化比较小的操作,如果方法不经过特殊设计的话出来数可能相关性就比较强,对于上面那种公式A、B、C值的选取就需要多考虑。

这种伪随机数的生成最终是需要mod常数的,所以会有周期循环的问题,就是每生成N个数,会重头按这N个数再生成一次,由于算法本身这个是不能避免的,所以算法只能尽量去拉长N的长度。

以上这种伪随机数生成虽然是通过算法不严格的弄出来,但大部分情况下没什么问题,而且也有一些问题是只能通过这种解决。比如各城市的汽车号牌摇号系统,摇号系统本身要求抽签过程可复现,于是每次只生成一个种子随机号,并且在官网上公布系统程序和种子数,用户如果对结果有异议那可以自己运行摇号系统,把种子数录入就可以根据种子数生成一串随机数,这些随机数每交运行时结果都是一样的,所以可以任何人都可以校验摇号结果。

那有没有真随机数生成器呢?哪怕伪随机数再好,也是伪随机。也有,一些系统会提供生成器,这些生成器的原理就是通过收集计算机各种状态,比如:鼠标移动了多远、硬盘温度、cpu运行频率等这些完全无法预估的情况,计算机收集了这些信息,将其加权整理形成一个数字,这些数才是真正随机数。

随机数除了这些还有一些奇妙的应用,比如知名游戏《魔兽争霸》,游戏角色的伤害值、躲避率等等这些都是浮动的,例如攻击值9-11,躲避率75%-90%,每次攻击会在这些区间随机选取一个值,那一个角色每次攻击就会需要多个随机数,这本没什么问题,但是玩家在游戏结束后是可以保存整体游戏过程的录像的,所以这些数是要被保存下来在录像中复现的,如果每次生成随机数都要保存下来,那这个数量就不会小,而一场游戏录像一般只有一百kb大小,所以这些生成的随机数是不能全存下来的。所以暴雪的办法就是游戏开始时生成一串随机数,比如12、15、78、32、43、65、27、90、78、93、1,每次需要随机数时从这个串里循环取数就行,游戏全流程只用到这几个值,由于游戏本身行为是不确定的,所以这些随机数对周期性的循环并不敏感。

上面提到,计算机无法自己生成随机数,需要从外部输入随机,那就留下一个脑洞,把概念放大,把计算机扩展到整个宇宙呢?如果宇宙本身也是一个计算机(因为宇宙本身也只是一系列符合物理规律的物体集合),那我们现实世界中真的有随机这个概念吗?你也是宇宙的一部分,那你脑子里想出来的随机真的是随机的吗?还是只是你认为的随机?

Theme Jasmine by Kent Liao Modified by eLangX