游戏中所存在的真随机与伪随机

作者:hi现场 日期:2018-07-20 18:56:03 浏览量:11

写这篇随笔的动机,在于最近看了不少对于游戏中概率事件的提问
在这些相关讨论里,总是能频繁看到“真随机”和“伪随机”这两个词汇。
其中最常见的句子则莫过于宝典一般的——“程序里没有真随机”。

这句话本身当然是没有问题的。
但是大多数时候,用这句话去回复别人的疑问就有点风马牛不相及了。

导致这种情况的原因就在于,在不同的范畴,“真随机”和“伪随机”实际上是有着不同的定义。
对概率提出疑问的游戏玩家问的基本上都是应用层面的随机问题
而回复者提到的却是程序原理上的真伪随机。
这样一来一回非但不能解释清楚游戏里的随机问题,反而会让看的人越来越迷茫。

所以,要想讲清楚这件事情,就必须把程序原理上的真伪随机和应用领域的真伪随机都详细说明一番。

程序原理上的真伪随机

对计算机有点了解的朋友都知道,在程序里,0就是0,1就是1,程序中是不存在可能为0也可能为1的数据的。
所以,程序也就不能自己生成“随机”的东西。

在程序原理上,真随机的定义是指,通过外置的观测设备,观测某个真正随机的事物的状态。
在需要产生随机数的时候,记录该事物的状态值,再以此值经过一定的算法,得到一个真正的随机数。
(也有部分人认为宇宙中不存在真正随机的事物,所以宇宙中也没有真随机……这个争论太玄学,咱们就不搀和了。)

所以,采用真随机对于程序来说,成本极高效率极低,在制作游戏的时候,没有人会蛋疼的买设备去做真随机。

而相对于真随机的伪随机,就是指在系统内部抓取一个程序员自身无法预料准确值的值,把该值作为种子,放进随机数生成器,由此得到一连串随机数的方法。

这句话听起来很拗口,实际上过程非常简单。在此我举一个最简单例子来说明:
随机数生成器的核心部分是一个函数,函数就可以写成f(x)的形式
这个x,就是一个随机种子
x的确定标准就是要无法预测,比如说可以选取系统开始运行之后的时间(单位毫秒)
然后把x放进f()
根据函数的特效,x的值确定,f(x)的值就唯一且确定
这个f(x)就是该随机数生成器生成的第一个随机数,我们记作R_1
(注:R1只是一个胚体,在实际调用的时候,还会用一个不可逆的处理方法使其变成我们需要的随机数——比如50到300之间的随机数,这个过程在此就略过不写了)
然后如果还需要第二个随机数,就把R_1放进f(),得到第二个随机数R_2 = f(R_1)
然后如果还需要第三个随机数,就把R_2放进f(),得到第三个随机数R_3 = f(R_2)
以此类推

R_1 = f(x)
R_2 = f(R_1)
R_3 = f(R_2)

R_n = f(R_ n-1)

由此可以看出,一旦某个随机数生成器的种子确定,他之后所产生的每一个随机数就都确定了
随机数生成器就好比一副空白扑克,放入种子的过程就好比给每一张扑克都写上一个数字
然后等着程序在需要的时候去一张张抽取调用

进而可以得到一个推论:如果两个随机数生成器的种子是一样的,那么他们这两副扑克的牌序也就都是一样的了。

分享:
010-574900539
Hi现场官方微信

Hi现场官方微信

获得更多现场最新动态,把握互动娱乐动向,请关注我们。