很多人看到我这个标题可能会认为我是标题党,不是伪随机难道还是真随机不成?
其实从随机数的定义来看,游戏里的随机机制不一定是一种数学定义下的随机,下面我们介绍一下常见的游戏随机算法(看看哪些是伪随机哪些不是),以及密码学定义下的随机(不用怀疑,随机性这个定义就是密码学提出的)
什么是随机
真随机:你脑子里随便想几个数,想说啥说啥,这些数都没有联系,各个之间都是相互独立的,完全不可预测的,一个真随机数生成器可以是【过去十分钟通过马路的人数】,这是完全不能预测的。
伪随机:由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。要求随机产生的数据随即均匀,与真随机不可分辨。一般认为,通过哈希算法的或者加密算法(包括对称加密和非对称加密)后的结果均属于伪随机,利用它们可以构建伪随机数生成器。
游戏里常见的随机机制
1.PRD
即Pseudo Random Distribution,伪随机分布,常见于各种抽卡和实时策略游戏里,一个很经典的例子就是暴击PRD算法,其的诞生是为了解决“暴击间隔不均匀”的问题。
这个算法的核心思想非常简单,就是通过一系列运算方式,让“理想情况下的暴击分布”出现的概率尽可能的大,让总暴击次数集中在总攻击次数的某一区间里的概率尽可能的小。换言之,就是让总暴击次数尽可能均匀的分布在总攻击次数中。
比如,DOTA中一个暴击率20%的英雄,并不是每一刀都20%暴击率的。而是以5.57%作为初始暴率,如果第一刀不暴,则第二刀的暴率增加到初始值的2倍:11.14%;如果还是不暴,就继续增加到初始值的3倍:16.71%,以此类推。
而如果在这个过程中任何一次攻击打出了暴击,就会把暴击率重置到5.57%。这样一来,暴击的触发就会形成一个“不太可能暴击–>有可能暴击–>很可能暴击–>必定暴击”的暴击周期,总暴击次数均匀地分布在总攻击次数上的概率就大大上升了,同时从宏观上来看,该算法模拟出的综合暴击率和纸面给出的理论暴击率是无比接近的。
同样,很多游戏的抽卡也采用这种算法,同时减缓几率增长速度,导致一开始很难抽到想要的角色和武器,只能吃保底。
2.洗牌算法
洗牌算法是将一组元素随机打乱顺序的算法,常用于模拟扑克牌游戏中的洗牌过程、音乐播放器中的随机播放等场景。 最早提出这个洗牌方法的是 Ronald A. Fisher 和 Frank Yates,即 Fisher–Yates Shuffle,其基本思想就是从原始数组中随机取一个之前没取过的数字到新的数组中,具体如下:
1. 初始化原始数组和新数组,原始数组长度为n(已知);
2. 从还没处理的数组(假如还剩k个)中,随机产生一个[0, k)之间的数字p(假设数组从0开始);
3. 从剩下的k个数中把第p个数取出;
4. 重复步骤2和3直到数字全部取完;
5. 从步骤3取出的数字序列便是一个打乱了的数列。
可以证明通过洗牌算法得到的序列是伪随机的,即通过生成种子得到的n个元素的排列是均匀的,即不可分辨的。
我的世界或者小丑牌里需要的生成种子,其实就是类似洗牌算法的种子。
3.水塘抽样算法
水塘抽样算法是一种随机抽样算法,它能够在一个很大的集合中,抽取一部分样本,并保证每个样本的选取概率都是相等且随机的,当然像原神这种抽卡游戏肯定不会这么干,不然少挣多少钱
水塘抽样算法的基本思想是,对于数据流中的第i个数,它有1/i的概率被替换为本轮随机抽样的结果。这种算法的实现非常简单,每个样本成为答案的概率是其编号的倒数,即1/i,其中i为样本的编号。通过这种方式,可以证明每个样本被选中的概率是相等的,即1/n。这种算法的优势在于不需要预先知道数据总量为多少,且空间复杂度为O(1)。
虽然这种算法是伪随机的,但是从商业层面讲肯定是亏钱的,常常被用于组合随机,即中奖概率使用PRD,但是中奖角色使用水塘抽样,如你第几次抽奖能中五星角色是PRD吃保底的,但是你具体抽到哪一张五星则是伪随机的,这样可以挣更多黑心钱。
在计算机中常常提到一个词,黑盒,不是小黑盒的黑盒,是用户看不到程序的运行原理的意思,只能看到结果,厂家正是利用这一特点,构建各种名义上的随机,让玩家依赖于所谓的玄学,所谓的玄学都是搞错了伪随机究竟是指什么,我相信肯定还是有运气成分在里面,但是厂商肯定是想赚更多的钱,所以每个抽卡人都该好好考虑一下这个问题。
#免责声明#
①本站部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
②若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
③如果本站有侵犯、不妥之处的资源,请联系我们。将会第一时间解决!
④本站部分内容均由互联网收集整理,仅供大家参考、学习,不存在任何商业目的与商业用途。
⑤本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与任何商业和非法行为,请于24小时之内删除!