pvz麦版讨论吧 关注:362贴子:9,775
  • 39回复贴,共1

从算法的角度讲讲为什么盲盒出怪必然伪随机且是如何伪随机的

只看楼主收藏回复

今天娱乐赛2路出怪的相当逆天,下面很多人都在提伪随机,但是没什么人讲一下PVZ里的伪随机机制。由于不知道麦版的出怪逻辑,这里就讲一下原版采用的随机数生成算法以及这个算法在原版里是怎么去运用的——因为麦版是基于原版的改版,所以这两者应当是一致的。
我会讲的比较通俗,确保每个人都能懂。希望能有一些科普作用,顺便借此避免一些节奏——比如如果有人通过某一次对局质疑麦版的出怪是“黑幕出怪”,大可以把这篇文甩上去,告诉他这是可能的。
(喷神镇楼)


IP属地:江苏来自Android客户端1楼2025-07-09 21:35回复
    PVZ采用的随机数生成器算法为MT19937 (梅森旋转算法)。
    算法内部维护一个数组 MT[0..623](共624个32位整数)。这个数组是算法的某一时刻初始随机状态,会随着“种子”的变动而变动(记住这一点)——那么什么是种子呢?
    种子是某个会根据某些用户的现实因素(比如时间)发生改变的值。
    这里我查了一下植吧,PVZ的种子因该取决于这四个因素:
    (随机数种子)=(用户 ID)+(游戏模式(无尽啊,生存啊这种叫游戏模式)的ID)+0x65x((选卡时轮数)+1)+(出怪种子)
    PS:这里的用户 ID确保了即使其他条件相同,不同玩家的种子会不同。所以这次的出怪说明这次娱乐赛用的的电脑是真的有沾点东西的(笑)


    IP属地:江苏来自Android客户端2楼2025-07-09 21:36
    收起回复
      2025-08-11 11:32:31
      广告
      不感兴趣
      开通SVIP免广告
      好的,现在我们有了一个叫种子的数字(后文用S代替)。
      那么我们怎么用S来影响MT[0..623]里的值呢?
      现在我们有个新的数字M(Mixed)
      M= mixed = S^ (S >> 30) (这些符号“>>”都是运算符号,我会贴在最后,感兴趣可以看一下)
      随后,我们让MT[1] (指的是数组里的第一个数)= (1812433253 * mixed) + i
      这样,我们就通过S得到了一个数组里的第一个数
      那么,后面呢?


      IP属地:江苏来自Android客户端3楼2025-07-09 21:36
      回复
        我们就让MT[1]=S,在通过上面的步骤算出MT[1] (指的是数组里的第二个数)
        后面就以此类推,让MT[i-1](这里i指序数,即数组中的第几个数)成为MT[i]的S
        这样,我们就得到了一个会随着“种子”的变动而变动的随机数组
        但这还不够,还不够随机。
        每生成624个随机数后,这个算法会对整个状态数组做一次扭曲,就是再此改一下个数组里的值,目的是打破线性关系(不知道的可以在这个情境下理解为可预测性),让数组更混乱一点(不过依然不是真随机)——这自然会包括各种奇怪的情况,有的甚至会有些过于极端了,会对玩家造成一些不太好的体验。


        IP属地:江苏来自Android客户端4楼2025-07-09 21:36
        回复
          所以,我们还有一次扭曲,让这个随机更均匀一点——防止出现一些和真随机较大的偏差。这导致MT19937只是在试图严格遵循概率法则,不回避极端情况,而是为了让整体分布尽可能接近理论概率分布,即使有时也会出现我们主观上觉得‘不正常’的结果。所以所谓的防止极端情况的算法和这个随机数算法无关,那是编程者自己加上去的


          IP属地:江苏来自Android客户端5楼2025-07-09 21:37
          回复
            另外,还有人提到了游戏里的随机只是一个数组在反复循环利用——是,也不是。随机的结果确实是在一个数组内,但是数组里的数字有2^19937 – 1个,可以说是不可能用完的(


            IP属地:江苏来自Android客户端6楼2025-07-09 21:37
            回复
              附录:那些前文提到的非线性运算们


              IP属地:江苏来自Android客户端7楼2025-07-09 21:38
              回复
                PS:讲的很通俗,所以省掉了很多比较复杂的东西(比如后面对数组的扭曲是怎么去扭曲的)。然后这个算法在很多游戏里都在用,感兴趣的话可以搜一下梅森旋转算法


                IP属地:江苏来自Android客户端8楼2025-07-09 21:41
                回复
                  2025-08-11 11:26:31
                  广告
                  不感兴趣
                  开通SVIP免广告
                  总结,PVZ里的随机是算出来的,所以必然不是真随机。同时,这个算法是为了逼近真实概率而产生的的算法,所以极端情况也必然是有可能出现的。


                  IP属地:江苏来自Android客户端9楼2025-07-09 21:44
                  回复
                    实力


                    IP属地:江苏来自Android客户端10楼2025-07-09 22:02
                    收起回复
                      还是代码高手


                      IP属地:安徽来自Android客户端11楼2025-07-09 23:18
                      收起回复
                        原来不同人的电脑随机数不同是真有依据的啊


                        IP属地:重庆来自iPhone客户端12楼2025-07-10 00:46
                        回复
                          同一个电脑,分路随机数循环周期,
                          s6确定大概是2.5-3小时/5-6小时。
                          这个和算法对上了吗。
                          比如,a阵容在一路连续测非常多组,中位数存活时间是17分钟。
                          那么连续多组数据>17分钟或连续多组数据<17分钟,
                          最多保持2.5-3小时。
                          比如,两个极端案例
                          >17分钟的,18 22 25 21 27 18 20
                          <17分钟的,13 5 16 12 15 13 16
                          基本没见过再长的了
                          六连和五连很容易


                          IP属地:内蒙古来自Android客户端13楼2025-07-12 00:12
                          收起回复
                            目前长时间连续测阵所得结果一般大致以2.5-3小时为一个周期,能找到理论依据吗


                            IP属地:湖南来自Android客户端14楼2025-07-12 00:19
                            收起回复