无论在现实世界还是《我的世界》中随机生成数字,随机数都是一个有意思的东西,它可以用来抽奖,甚至还能用来设置密码。不过事实上,利用计算机生成的随机数都是伪随机数,严格的真随机数并不存在,本篇教程中的随机数生成器的目的是让生成的随机数更加接近真随机,利用这个生成器能够生成0-255的随机数。
一、基本原理:
首先我的世界中,物品分为可堆叠(羊毛)以及不可堆叠(铁剑),他们在容器(漏斗)中可被比较器读取,输出不同的信号强度。在漏斗中,单一物品所输出的信号强度,可堆叠物品为1,不可堆叠为3,这可以从下图中红石灯亮起的数目看出。
通过将投掷器与漏斗相连,我们得到投掷器-漏斗脉冲发生器,同时我们在投掷器中分别加入羊毛和铁剑,来分析这种情况下投掷器会优先输出可堆叠还是不可堆叠物品。
按照上图做一个高频电路来控制投掷器-漏斗脉冲发生器,让其不断输出信号,在具体操作中,我们发现红石灯亮起的数目在1和3之间不断随机切换,因此我们可以发现投掷器投掷物品是随机的。
二、最简单的随机数生成器
从一中的装置我们知道了比较器输出的信号强度会在1和3之间切换,因此我们可以将其改造成输出0和1的装置,即在比较器后三格处放一个红石灯,这样如果比较器输出的信号强度为3,那么红石灯亮,如果输出强度为1则红石灯灭。
有了这个基础之后,我们就可以制作一个最简单的随机数生成器,如下图所示,将这个装置复制8份,这样就变成了一个8位的随机数生成器。将它们接入到高频电路上,红石灯会一直在亮灭之间随机变化,利用下面那个拉杆固定红石灯状态,我们用红石灯的状态来表示二进制中的0和1,亮为1,灭为0。那么下图这一时刻表示的二进制数字就是01110011,转换为十进制就是115。利用这个装置能生成的最大数为11111111,即255。
因为投掷器投掷物品具有随机性,所以其实对大多数玩家来说,这样的随机数生成器就能用了。但是实际上,投掷器是应用伪随机机制射出容器内物品,虽然看似随机,但还是有规律可循。
三、较严谨的随机数生成器
在玩家不了解伪随机公式的情况下,二中的随机数生成器也可以实现随机生成数字的功能,但是这样的结果肯定不够完美。因此,我们接下来就要制作一个更加严谨的随机数生成器。
下面这张是完成图:
每个随机单元采用4个投掷器-漏斗结构。当这个单元被激活后,4个投掷器同时输出一次脉冲。只要其中1个脉冲的信号强度为3,这个脉冲将会激活加法状态的红石比较器,这个单元将被再次激活;如果4个脉冲的强度都为1,那么这个单元将只被激活一次后停止运作。
下面我们就开始建造吧~
第一步:建造第一层,如下图所示,放置红石和红石中继器,注意中继器的方向,当中继器被激活时中间的四个完整方块和红石将被充能。
第二步:建造第二层,四个投掷器呈十字摆放,方向朝上,在第一层的红石中继器上方各放置一个方块。
第三步:第三层,在每个投掷器上面放一个漏斗,四个角分别放一个红石比较器,红石比较器的输出端放一个完整方块,当红石比较器输出信号时,方块被充能从而激活其下方的红石线。这么一来,就实现了只要四个漏斗其中1个脉冲的信号强度为3,就会激活相邻的投掷器。这样便大大增加了其不确定性,也就增加了随机数产生的随机性。
第四步:为了增加随机性,我们可以将第三步中的随机单元进行复制连接。如下图,我们将以上随机单元复制32个,构成4*8的矩阵。每2个单元共用一条邻边,这意味着如果这条边获得一次强度为3的脉冲信号,那么这个单元在激活自身的同时也将激活与它相邻的另一个随机单元,起到传递信号的效果。在试验中,我们发现在投掷器中放入1份不可堆叠物品与3份可堆叠物品比较合适,这样能让这个信号不停地在单元与单元之间传递,而不会全部停止运作,也不至于全部都输出3强度而卡死。
第五步:如下图所示,最终在整个模块的边缘,我们选取了8个输出位置,作为输出的8位二进制数,点亮的红石灯代表1,熄灭的代表0。这个信号每3红石刻变化一次,使用拉杆来固定某个时刻的输出,也就是让玩家手动选取,这样加入了玩家自身的因素,可以增加数字生成的随机性,不单单只是代码运算的随机结果。
以上就是随机数生成器的介绍,原理比较简单,但是建造过程可能相对复杂,对于有较丰富红石经验的玩家,可以尝试建造bcd(二进码十进数)模块,将二进制信号转化为十进制数字方便查看。在知道了原理之后,玩家们也可以发挥想象力,建造出更加严谨的随机数生成器~