理解编程:就像做饭一样(随机数)
理解编程

本文共1436字,用简单的类比探索计算机科学的哲理。
01
真随机数与伪随机数
根据密码学原理,随机数的随机性检验可以分为三个标准:
统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。
密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。
相应的,随机数也分为三类:
伪随机数:满足第一个条件的随机数。
密码学安全的伪随机数:同时满足前两个条件的随机数。可以通过密码学安全伪随机数生成器计算得出。
真随机数:同时满足三个条件的随机数。
研究这些东西有什么意义呢?那我们来类比一下:
天才小厨王有时候做饭会率性而发,根据天气、聊天的气氛、吃饭的环境随机地加一些佐料,这导致他的美食十分受欢迎,但又无法模仿,甚至没法写出食谱,最终使他成为了国王的御厨。
盗版小厨贼想成为并超越天才小厨王,于是他反复地研究小厨王的资料、配方、做法和食材,努力地把这些方法找到,并试图把这些做法以食谱固定地记在心里,以推断出真正美味的真谛。但是他失败了,他做出的美食味道和天才小厨王很像,但就是差点什么。有时候他也会率性而发,但依旧不如小厨王那样美味。
天才小厨王慢慢年事渐高,需要找个徒弟将他毕生所学传承下去。他找了一个资质不错的徒弟,带着他识天文地理,体味人情冷暖,洞悉喜怒哀乐,告诉徒弟一定要与人烹饪而非与物烹饪。在天才小厨王去世后,徒弟也开始为国王烹饪美食,国王发现徒弟做的美食和师傅做的确实不一样,但是都是一样的美味好吃。
好了,故事先讲到这里。我们大概知道了小厨王的成功以及其徒弟的成功是与真随机数密切相关的,而盗版小厨贼的失败是与伪随机数密切相关的。天气、氛围、环境等外在条件瞬息万变,人类无法预测,这是真随机数;食谱、配方、做法等这种可以穷举的东西,人类可以完全预测,这是伪随机数。在一次做饭时,小厨贼无法按照要求穷举出符合食客满意的做法,那么必然是失败的。
02
计算机里的随机数
计算机是可以产生所谓的真随机数和伪随机数的。
首先是伪随机数的产生方法,以最简单的线性同余法发生器(Linear Congruential Generator,LCG)为例。
使用这个方法产生的伪随机序列

满足:


就是seed(种子)
。每次调用rand
的返回值,就是下一个

。
其中:

这个方法有2个特征:
产生的伪随机序列有周期性;
在一个周期内,
的取值不重复。
这样就解决了随机数的问题。
然后是真随机数,这里只列举一些可以产生真随机数的方法:通过放大电路的热噪声来产生随机数;通过捕捉系统某些参数产生随机数;通过记录用户行为或者进程行为产生随机数等等。这些方法一般效率不高。
最后,有些网站是提供真随机数API的。他们所采用的随机数生产方法包括通过天气变化产生随机数;通过分子运动产生随机数等等。
03
关于不可预测
这个世界上不可预测的事情很多,从数学的角度说就是算不出来,从计算机的角度说就是模拟不出来。下面这张图展示了数学的难度,可能最难的就是随机的了吧。

