【冰话XS】009:真假随机 谁是真招谁把戏

☆※冰の引言※☆
前文主要介绍了 XS 函数中的测试神器 xsChatData() 函数:独特的全局广播在多人局中可以堪称利器,彻底打破了发送聊天必须针对特定玩家的限制,一条顶八条!以往对于帝国中的随机部分介绍不是语焉不详,就是浅尝辄止,这方面的研究还不算太到位。本文属于独家全网首发,是第一篇深入全面解析帝国中的随机(Random)这一效果的教程,从零开始悟随机,看这篇足矣。关于真假随机的研究,本文的从全新角度の经验总结与亦是首次披露。不多赘述,让我们驰骋于随机的世界,感受这一效果的独特奥妙吧。

☆※本节の紹介※☆


☆※随机百分比の庐山真面目※☆
俗话说:"兵无常势,水无常形",可以说战役设计者和游戏玩家总是存在着套路与反套路的斗争.为了让玩家没那么容易看穿猜透设计者的思路,使用随机事件成为设计者必然的选择。把事件的判定权交给电脑自行判定,每次打开同样的场景都会发生不同的结果,这样既可以很大程度上减轻通过先开全图背板对场景趣味性大幅降低的负面影响,又能使游戏过程变得充满未知与刺激,在惊喜中略带有跌宕起伏。
在帝国时代2决定版中,就有一个专门用于随机的条件,官方名称为机会(Chance),这名称在游戏效果上不太准确,最准确的翻译名应为"随机百分比(伪随机)"。

为什么会起这个名字,顾名思义,这个随机百分比不是真的随机,而是微软炮制出来的伪随机。乍一看,“随机百分比”这个条件里,只能填写一个参数,理论上说,这个参数应该指的就是触发的概率值(范围0-100)。比如设置20,就是有20%的概率触发该效果,80%的概率不触发该效果,这样的结果才是满足设计需求,但如果你这样写的话一定达不到你想要的效果。
究其原因,是由这个条件的运行原理所决定的,这是一个无条件自循环的条件,就算你不开循环,它也照样会循环触发,这点相比其他触发条件算是比较特殊的。举个浅显易懂的例子:就好比你丢骰子,你的设想是20%的概率摇到6, 80%的概率骰不到6,无论是否摇到6,我都只骰一次;但是微软的想法却是20%的概率第一次摇到6,不论我骰多少次,我必须要骰到6,所以骰到6这个是个必然事件,这个条件的触发机制是以骰到第一次6作为终结条件的,所以这从根本上违背了概率学的原理,就算你设置1%,这个条件即使再苛刻,终究还是会达到触发条件,只是这个骰的时间越长,触发时间也就越长罢了。如果我们写个开场50%概率获得1000黄金,单单使用这个条件是无法实现预想效果,你必须通过写两个一样"随机百分比"条件的触发才能实现,非常的麻烦。
让我们从一个案例中洞悉要实现一个简单的随机功能有多繁琐了:为了和玩家斗智斗勇,减少玩家通过背板记地图走捷径枉费作者一番设计苦心的情况,我们希望地图上AI的火星兵可从随机点神出鬼没出现,而不是在固定点进行刷兵或者是在同一点可刷出随机的兵种诸如此类。比如说同一点随机刷出步弓、骑兵、步兵,概率各为三分之一,需要如下所示编写触发:

这里需要强调的是数值这里只要不是0或100其实都随意,毕竟原理在上面的部分已经做了充分的阐明,因为这里的数值并不是我们传统意义上认为的概率,所以在等概率随机设计场景中该数值无意义。这里的触发逻辑大概思路如下:三个触发代表一个随机事件的三个不同分支,系统先摇到某个分支,就关闭其他分支。如果在触发一个分支后不及时关闭其他分支的话,其他分支也会被触发,只是时间长短问题。将其依此规律延伸开来,如果要做N个分支就要写N个触发,触发了这N个触发中的某一个的同时,还必须写上关闭其他 N-1 个分支的触发效果,不可不谓是非常繁琐了,特别是分支越多的时候这个随机系统设计的工作量将成指数式增长,当我们需要设计N个分支的时候,使用随机百分比需要写 N*(N-1) 条关闭触发,想想都知道有多恐怖了。触发的先后顺序必定存在延迟,所以用随机百分比不可能实现N分之一的严格等概率的设计,伪随机可以说是名副其实的。当然那种什么第一种设置数值为33,第二种设置数值为50,第三种设置数值为100来做严格等概率三分之一的做法纯属扯淡,这种盲猜的三分之一是经不起考证和推敲的,也没办法通过理论推导证明。综上所述,随机百分比(伪随机)不可能承担起严格等概率的随机设计的重担,也不可能实现这一目标。随机百分比可以说只是花拳绣腿,"假把式"实锤无疑。

☆※伪随机の局限性※☆
从上文的分析,可以清晰明了地得出随机百分比(伪随机)的局限性,罗列如下:
无法实现严格的等概率随机设计,简单的设计无从谈起
多并发相互独立判定的原理注定了多分支的随机设计需要搭配海量的关闭触发,繁琐
作为一个恒成立的条件,触发时间无法得到精准把控,全程看脸,极不靠谱
烈火现真金,随机百分比可以说只是花拳绣腿,"假把式"实锤无疑。但是这"假把式"是不是真的没有存在价值,真的一无是处?这里可以给出肯定的答案:是的!随机百分比是个纯纯废物的条件,在 XS 横空出世之后,它的历史使命已经完成,业已可以光荣退休了,XS 函数既能实现等概率随机设计,也能实现不等概率随机设计,它行的人家也行,人家行的它却不行,长江后浪推前浪,随机百分比已然成了可有可无的存在,有它没它已经无足轻重。退一万步讲,在不等概率的随机设计方面,随机百分比还算是能有一定的用武之地,这应该算是伪随机仅存の打开方式。

☆※伪随机仅存の打开方式※☆
在不等概率的随机设计中,随机百分比中的数值代表该分支可能触发的权重,数值越大权重越大,与此同时触发的概率也就越大。举个栗子,我们希望设定75%获得100黄金,25%概率获得1000黄金,此场景下两者概率并不相等,我们可以把随机百分比的值一个设定为75,另一个设定为25,或者一个设定值是另一个设定值的3倍即可,这样两者并发执行概率的判断,触发"获得100黄金"的概率就会比"获得1000黄金"高2倍,貌似形成了75%对25%的概率(其实只是错觉罢了)
伪随机使用最成功的案例莫过于日本史诗长篇北条氏系列中独创的御守系统(Omamori)。这种在游戏里首创的抽奖系统,具有非常广泛的普适性,基本上来説,换个背景,换个内容,即可完美套用,像之后的自定义战役大理王朝也借鉴了这一点来进行设计。毋庸置喙,这个系统如若能推广开来,足以在一定程度上改变目前建毁战役千篇一律的思维定式,为战役创新性增添一抹亮色。
而抽奖自然要分为一二三等奖,越好越高级的奖励中奖概率越低,自然就不能搞均分吃大锅饭,肯定是要有奖励差异化和概率不等化,那么伪随机就到了能派上用场的时候了。
对于随机百分比来说,它的强项在于不等概率的随机设计,毕竟它无法做到严格的等概率随机。而在不等概率方面,设计不需考虑是否真正达到相关骰取概率,只需让不同分支的骰取概率拉开一定数量级的层级差距即可。不同分支的数值大小则能恰好体现骰取权重之间的对比,什么分支容易骰取,哪些分支较难骰取均由骰取权重所决定。
当然想当欧皇非酋的夢是每个人的梦想,但是真正骰取之时好不好彩还是看脸、看人品、看運命的,还是那句老话:"因缘到了,一切都将水到渠成",所以嘛,对于抽奖这件事而言放平常心,毋论抽到啥都是命运使然,好不好都是你的運命。
最后小结一点,随机百分比只能用在不等概率的随机设计当中,而等概率随机设计怎么解决呢?那就留待真随机的粉墨登场带给我们完美的答案吧。

☆※真随机の无双工夫※☆
有假必有真,你方唱罢我登台。如果想做严格的等概率随机设计,对于XS脚本调用函数而言舍我其谁,上佳之选.没有比之更适合的了。XS脚本调用函数在随机这个领域主要由3个函数构成.而这3个函数以是否含参(包含参数)为维度,又是花开两朵各表一枝,分成两类:分别是全随机函数和条件随机函数,而这两者统称真随机函数。

☆※全随机函数:xsGetRandomNumber()※☆
xsGetRandomNumber()函数作为一个不含参的全随机函数,范围是系统固定死的:0 ~ 32766,我们只能通过数学运算调控它阈值的范围。比如典例就是一个普适性的例子,任何变量以及任何玩家的资源均可以通过全随机函数作随机化处理,而且默认情况下该函数只会运行一次,与传统概率学的定义完美吻合,与下面要介绍的条件随机函数堪称等概率随机设计的典范。
这里阐述一下随机亏本范围的定义及应用。随机亏本范围即设计者希望在多大的概率下通过随机化系统后会产生亏本的范围,比如说我的随机化系统希望有2/3的人在通过随机化系统后能产生增益,1/3的人则蒙受损失,此时的随机亏本范围( y/x )即为1/3。以此类推,如若想40%的人蒙受损失,则该模型下的随机亏本范围数值为2/5等等。
关于全随机函数的随机化系统设计可以有很多别样的玩法,笔者这里仅列举最简单的入门级案例供各位理解该函数的实际应用场景,希望能抛砖引玉,在此基础上设计出更新颖更别样的系统,实现各自符合自身要求的理想效果。

☆※条件随机函数※☆
相比于全随机函数,含参的条件随机函数在等概率随机设计方面可以更自如的发挥。
--- xsGetRandomNumberLH()函数 ---
特别提醒:目前因游戏存在 bug 的原因,xsGetRandomNumberLH函数实际效果与同区间长度的xsGetRandomNumberMax函数的实现效果完全一样。实际该随机数出现的区间在 0~(H-L) 之间,包含0但不包含 (H-L) ,所以需要使用规避措施进行优化。
规避措施の诀窍:详看下面典例分析的介绍
--- xsGetRandomNumberMax()函数 ---
本函数目前游戏中的效果与上面介绍的条件随机函数的实现效果完全一致,两者目前可以混用。与前者不同的是,该函数仅有一个参数,代表设定上限,设定下限强制为0。下面还是以日本史诗长篇北条氏系列中匠心独创的闪耀暖暖换装系统作为使用案例讲解该函数肯定具体应用。
当然,这套系统可以移花接木到任何等概率随机设计,在大框架不变的基础上结合设计者个人的需求,通过更换效果可以完美实现所有的等概率随机设计。任何等概率随机设计上的问题,碰到 XS 的真随机函数的真功夫也必将迎刃而解。

☆※真随机の不等概率随机设计※☆
曾经笔者也认为真随机不能实现不等概率的随机设计,但是笔者发现能进行等概率随机设计的一定也能进行不等概率随机设计。关于前面的案例御守系统,如果用真随机来做设计的话,远比使用随机百分比简洁明了,而且在概率上更具象化更精准。
在 XS 中实现严格不等概率的设计の原理:通过设定几个模式,然后分配各自独立不均等的随机数区间,使随机数落到各个区间的概率不同产生差异,从而实现利用等概率原理设计出不等概率的效果。
当然,如果使用外挂 XS 文件,在没有256字符上限的束缚之下,甚至可以一个触发搞定。
至此, XS 真随机函数可以解决随机界一切的问题,XS 真随机函数无敌的存在说明,随机界任何需求 XS 真随机函数都能完美胜任,那还要什么鸡肋的随机百分比呢,一曲凉凉唱罢,迎接伪随机的那只能是无奈的落幕,毕竟时代已然变了。

☆※真伪随机の选择优先级※☆
纵览全文,我们可以总结出以下经验之谈:在任何条件下都应选择真随机函数,如若需要等概率随机设计,首选真随机函数自不必说,而若需要在不等概率随机设计上有一番作为,真随机函数依然是不二选择。设计者可结合自身需求,对号入座进行优选法,寻觅解决需求方案的至佳途径。

☆※冰の小结※☆
本节从随机百分比开始讲起,继而带出了帝国中真随机与伪随机之争,而后以详实的例子对真伪随机的使用指南娓娓道来,所论述之内容均为独家首发,可以肯定的说,这定是目前国内外对于帝国时代2决定版中关于随机的使用最详细最全面的解读。下期将重点聊聊资源、变量之间的万物互联,想洞悉这物联网世界之无穷奥妙,下期不见不散!
欲知后事如何,请听下回分解


