Minecraft 中的地形是随机生成的。但是这里有一个问题,就是在 Java 中,也包括绝大部分其它计算机程序中,所谓的「随机」不是「真随机」,而是「伪随机」。

什么是「伪随机」?计算机进行的是确定性运算,不存在随机性,这意味着想要求计算机「独立」生成「真正」的随机数,在理论上不可能。在外界辅助的情况下,才可以生成「真随机」数,但是这里暂且不谈。一般的编程应用中想要随机效果,使用的都是「伪随机函数」,就是用某种非常复杂的算法,来生成一系列看似毫无关联却又均匀分布的数字(例如 0.9024310185642406, 0.6399798616249142, 0.8728940712975358, …),称为「伪随机数列」,以此来模拟随机的效果。每次程序调用这个伪随机函数的时候,就从这个数列中取出下一个数字返回给程序。这样做在孤立来看是没问题的,但是问题是如果你把程序关闭,重新启动运行,你得到的还是原来那个数列,每次取随机数取出来的还是跟上次一样的那些数字,例如仍然是「0.9024310185642406, 0.6399798616249142, 0.8728940712975358, …」。如果你依赖这个数列来生成游戏内容,那么每次游戏所得到的的结果都会一样,而他们本来应该是随机的才对。

为了解决这个问题,我们只能从「伪随机函数」外面给它加入某种「扰动」,让它在每次运行的时候实际采用略微不同的「伪随机算法」,以产生不同的「伪随机数列」。「种子」就是最常见的一种扰动方式。相同的「种子」产生相同的数列,不同的种子产生不同的数列。如何保证每次运行的「种子」不相同呢?最简单的办法就是采用「系统时间」作为种子。相同的程序,上次运行和这次运行的时间肯定不一样,这就确保了每次的种子不同。当然,如果你人为去修改系统时间,并且让两次运行时的系统时间严格一致,那么还是会得到相同的运算结果。但是作为游戏来说,一般没必要考虑这些。

Minecraft 里面的地图种子就是这样的原理。地图本质上是「伪随机」生成的,跟别的游戏没什么区别,但是我们知道 Minecraft 是个比较 geeky 的游戏,它把种子的控制权交给你,允许你指定种子,那么当你使用相同的种子的时候,游戏中所有本该「随机」的元素都会变成「命中注定」。不仅生成的地形完全相同,连什么地方会刷出什么花草牛羊都一样。如果玩家的玩法操作也完全严格相同的话(这个不太可能),那么整个游戏完全就等于是在放电影,一切都是预定好的。

— 完 —

本文作者:Jawley

【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)
延伸阅读:
有哪些类似 Minecraft 的沙盘游戏?
玩好 Minecraft 有哪些技巧?

分享到