曹操传吧 关注:83,926贴子:1,281,867

简单说说曹操传中的伪随机

只看楼主收藏回复

今天看到一个帖子:

该贴主能把两个机制完全不一样的mod放在一块来提问,说明很可能完全搞不懂或懒得去弄懂两者之间的区别。当然这里也有豪曹作者有意无意混淆概念的功劳,倒怪不了贴主。
首先我们必须明确一点,所有曹操传的mod都是使用了伪随机算法,除了豪曹14,完全摆脱了伪随机,仅仅是在每关开局调用了一下伪随机算法来重置全体武将集气(因为豪曹14攻击判断没有使用伪随机,所以该mod与主题无关,其实现机制以前有讨论过,这里不再赘述)。
这里需要引一个伪随机的基本概念:

通过查看汇编可以知道,原版曹操传游戏里,就是使用了大多数程序里一个十分常用的标准伪随机算法,并且只有在读档的时候才会重置【随机数种子】。因此,该贴二楼很合格,说得一点没错,只要你不读档,就肯定还是使用和产生同一个伪随机队列。

6.1里所谓的【伪随机】,其实就是在存档的同时把【随机数种子】也给保存下来,读档时不再重新获取而是直接设置【随机数种子】。如此即可保证每次读档后都能够得到完全相同的伪随机队列。
其实只要你理解了原理,就会发现6.1这种伪随机,反而更方便玩家可以机智地SL。因为这种情况下的伪随机队列是可以通过SL来大致推断出来的。
例如说:
如果当前【预备伪随机数】是70(假设范围为1~100),意味着只要命中率小于70就一定会打铁。
那么我们就应该让一个命中率高的人先攻击消耗掉这个【70】,从而等待下一个更好的【预备伪随机数】产生再让敏捷较低的人攻击。
如果是更机智的玩家,自然会想到,既然敌我使用的是同一个伪随机队列,那么只要把那些不好的【预备伪随机数】留给敌方,就可以更有利于我方等待并得到更好的【预备伪随机数】了。比如故意让敌方反击miss消耗一个坏数,假如没有反击判断的话则该坏数就得留给我方了。
诚然,这些都属于投机倒把的行为,确实是不值得提倡,也没必要深入研究(我没有玩过6.1的mod,以上都是凭经验举例)。只不过,本着实事求是的原则,时不时看到一些对伪随机误解的帖子,这回实在是不吐不快。曾经还有人在我的补丁发布贴里建议添加并大赞伪随机功能,当时真的感到十分无语。
说了那么多,其实想说的就是:只要还是伪随机,就一定可以继续SL。根本不存在什么伪随机就不能SL的说法。你不能SL,只能说明你没有掌握或懒得掌握其中规律罢了。甚至有的人连SL本身都不屑的,这都没问题,属于个人偏好,但是总不能由于他不屑SL而否定SL的作用吧?同理,总不能由于你不懂伪随机下SL而断定伪随机不能SL吧?
P.S.
本来只是想回复该贴主的,后来想想这些应该不是贴主想要关心的东西,说了也等于白说(有如该贴4楼层主)。不如专开一贴算了,让感兴趣的人有机会稍微看看,有个简单的概念。绝对不是为了水经验,不信可以点击查看我所关注的贴吧。


IP属地:广西1楼2017-06-02 09:28回复
    真的是长知识了,以前真的是不了解伪随机的定义,现在彻底懂了


    IP属地:山东来自Android客户端2楼2017-06-02 09:36
    回复
      很明显除了豪曹2014无法sl之外,别的新引擎modsl还是可行的。但是之前打6.0岳飞传的时候我曾经sl五次百分之一命中,结果全部命中。当时我就猜测档里面存了种子。果不其然。这就可以解释为什么新引擎mod的sl效果普遍不明显了。


      IP属地:山东来自Android客户端3楼2017-06-02 09:51
      收起回复
        厉害


        来自Android客户端4楼2017-06-02 10:01
        收起回复
          这里在顺便补一个通常计算机上的【真随机】的算法实现吧。说出来也很简单,其实就是【伪随机】算法的基础上再不停地重置【随机数种子】。这样就可以确保当前产生的随机数是与上一次无关的。
          比如说,有的游戏会在每次攻击前都重置一次【随机数种子】,这样就可以确保每次攻击都是无规律的。否则,根据【伪随机】的平均概率算法,这次攻击命中以后,下次攻击命中的概率一定相对降低。等于说连续得到两个很大的数的概率很低,但是,重置【随机数种子】后,这一次得到大数的概率就与上一次无关了,符合【真随机】的期望值。


          IP属地:广西5楼2017-06-02 10:02
          回复
            以6.1为例即是说,战场取得一组数列后,不再做更改。
            一种 圆桌武士 打红绿震的感觉


            IP属地:江苏6楼2017-06-02 10:07
            回复
              感谢伯伯的论述,很有营养的主题呢


              IP属地:河北来自iPhone客户端8楼2017-06-02 10:18
              收起回复
                跟火纹乱码凹点差不多一个意思啊


                IP属地:江西来自Android客户端9楼2017-06-02 13:11
                回复
                  “伪随机”太宽泛了,三国志11的战法、dota斧王的大风车这些都是伪随机,但和曹操传mod都不是一码事


                  IP属地:浙江10楼2017-06-02 13:26
                  收起回复
                    豪曹根本不是伪随机,那是集气槽系统,对于不sl的来说,伪随机,真随机根本没有区别,比如火焰纹章,有几代用了伪随机,有几代用了真随机,但是他几乎是没有战场存档的,所有根本没区别,你不用模拟器去sl,根本体会不到区别。豪曹的集气槽就不同了,理论上来说,在用伯伯补丁观察出集气量之后,你几乎可以算出后面所有的情况,哪个AI先动,他是命中还是打铁,你反击是不是暴击,这些都可以提前算出来,但就算如此,计算量如此大,大部分情况,也是直接点个回合结束看一下,让游戏自行演算,比自己算总要快不少。自己算就是顺着AI的思路走一遍,大部分人对游戏还没有如此的熟悉,根本不存在这样的运算能力。


                    IP属地:江苏12楼2017-06-02 17:07
                    收起回复
                      我没记错的话豪曹也没说自己是“伪随机”啊,只是说的大致类似于“不能SL”。


                      IP属地:加拿大来自iPhone客户端13楼2017-06-03 00:12
                      收起回复
                        难得的技术贴,必须顶


                        IP属地:江苏来自Android客户端14楼2017-06-03 00:32
                        回复
                          哇~伯伯大大叕出技术贴子噜~小白之前理解的伪随机原来是错的喔,真是涨姿势了!小新人后排帮顶!


                          IP属地:广东来自Android客户端15楼2017-06-03 10:28
                          收起回复
                            吃瓜群众受教了


                            IP属地:湖南来自Android客户端16楼2017-06-03 17:23
                            回复