玩家在评估风险时的误解。 开发中对随机数发生器的控制

从本质上讲,人脑在给定的数值等级的基础上评估随机事件发生的可能性非常差。 根据质量评级还算不错。 所有这一切都是因为一个人在心理上将数值概率转换为定性估计,并且非常主观地做到了:

  • 游戏中80%的命中率-几乎可以保证命中率;
  • 您的同志至少有一天偿还债务的事实的80%是“不行不行”,这是行不通的,这风险太大;
  • 5%受到了致命伤害,他是敌人的NPC-不太可能忽略风险;
  • 如果您在房顶下滴下米高的冰柱,则有1%的冰柱掉落的危险-除此之外,最好在人行道的另一侧走动;
  • 在大型RPG中赢得迷你游戏的机会为51%-您可以指望这样的事实,即20个赌注之后,我将赢得一点或至少留在自己的赌注中……20个赌注后,这种情况怎么发生,我输了一半我的钱黄金? 在这里,随机数生成器显然已损坏!


本文将考虑以下问题:

  • 概率估计中的错误假设;
  • 玩家误解和“罕见”事件的实际概率的具体示例;
  • 随机数生成器(通常为伪随机数);
  • 早期的简单伪随机数生成器,以《最终幻想I》为例;
  • 具有可重复性和没有可重复性的随机事件的实现方法;
  • 在Fire Emblem中成功实现不同方法和操作的示例。

I.概率估计中的错误假设


在进化过程中,人脑通过对事件的定性评估和对其经历的印象学习到了很好的操作。 一个人相对较近地想出了数字和“随机”事件概率的抽象数值估计[ 1 ]。 尽管如此,人们在他们的估计中仍会将这些数字转换为定性表示:一点点,一点点,很多点,危险,安全,足够。 这些评估始终取决于上下文和对此上下文的主观态度 。 这恰恰是错误的数值假设的主要原因。

例如,将考虑基于回合的游戏弟子2 [ 2 ]。 本文的这一部分将不专门考虑此游戏中随机数生成的质量。 本文的第二部分将提供有关其生成的足够数据。

弟子2-典型小姐[ 2 ]

标准的近战攻击有80%的命中率。 通常,玩家会将此机会视为“ 几乎总是 ”,而错过机会的风险则是“ 偶尔/偶尔 ”。 两次连击两次的机率是4%。 玩家将这种风险视为“ 几乎不会/这种情况极少发生 ”。 当这种情况发生时,玩家会对“曲线随机”感到愤怒:[ 3 ]; [ 4 ]。

但是在连续两次未命中且风险评估为4%的情况下,玩家进行的快速评估有几个错误的假设:

1. 4%并非“ 几乎不会” 。 平均每25个独立实验都会发生一次。

2. 评估是在错误的时间间隔进行的 。 最小测量间隔为80%,而不是2次攻击,而是在“疲倦”的玩家记忆中进行的所有相同级别的攻击(约80%)。 通常,在这段时间里,您可以进行长时间的游戏或整个游戏,这全都取决于游戏的类型,玩家的记忆力和玩家的偏好。

由于我没有关于该游戏使用情况的真实统计信息,因此我将基于以下假设:在《门徒2》中进行长时间的游戏会持续3个小时,在此期间,进行了大约250次攻击,准确率约为80%。 值得注意的是,应该忽略敌人的失误,因为 他们错过比赛的球员并不生气,他很少记得他们。

因此,应该评估这种情况:“对于所有250次攻击,将永远不会发生2次未击中。”
为了计算此事件的真实性概率,使用了重复公式:P1(n)= 0.8 * P1(n-1)+ 0.16 * P1(n-2)。 在推导此公式时,我利用了社区的帮助,下面提供了计算,详细信息和结果的引用。
您可以尝试使用归纳法。 我们介绍一些符号。 在第n次郊游后保持爪子的概率由P(n)表示。 我们将此概率表示为两个概率之和
P(n)= P1(n)+ P2(n),其中P1(n)是第n个极端郊游成功的概率,而P2(n)-不成功。

似乎P1和P2与0.8和0.2成正比,但事实并非如此。 由于我们不考虑任何可能的结果,而只考虑那些保存了pa子的事实。
现在让我们尝试得出一个递归公式
P1(n)= 0.8 *(P1(n-1)+ P2(n-1))
P2(n)= 0.2 * P1(n-1)
将P2代入P1的公式即可得到
P1(n)= 0.8 * P1(n-1)+ 0.16 * P1(n-2)
递归关系的进一步解决方案[5]
来自用户Serbbit的引用[ 6 ]

为了解决该问题,而不是了解解决递归关系的方法,而是为浏览器控制台编写了一个小的javascript代码,并计算了结果。

var P1 = []; P1[0] = 1; P1[1] = 1; for (var n=2; n<=250; n++) { P1[n] = 0.8 * P1[n-1] + 0.16 * P1[n-2]; console.log(n + ') ' + P1[n]); } // : 250) 0.0001666846271670716 

答案是:0.0001666846271670716
0.0167%

该答案与另一位作者Kojiec9的答案相符:0.000166684627177505 [ 6 ],该作者将他开发的方法与五进制十进制结合使用,并使用帕斯卡尔的公式计算结果。 答案的微小差异显然是通过四舍五入浮点数来解释的。

因此,在打徒弟3个小时的3个小时中,玩家有机会以0.0167%的准确率避免两次错失。 现在,这真的不太可能。 (并且至少有两次未命中的概率分别是99.9833% )。

随着实验数量的增加,至少两次未命中的可能性增加

顺便说一下,关于人类记忆的不完美和扭曲,总的来说,存在着完整的研究和书籍:“大脑的错觉。 由于信息过多造成的认知扭曲” [ 7 ]; “不相信自己的大脑” [ 8 ],如果您对此主题感兴趣,我建议您开始熟悉这些文章。

3.第三个错误的假设是在相互独立的实验中对依赖性期望

也就是说,在第一次错过之后,玩家认为:

“因此,角色错过了80%的准确率。 现在,他肯定会成功,因为再次错过比赛的风险只有4%。”

但是没有 第一次错过之后,再次错过的风险也将为20%。 毕竟,过去的攻击已经发生,并且不会影响以后的射击。 而且,如果在第一次进攻前两次未命中的概率是4%,那么在第一次未命中之后两次未命中的概率已经变成20%,也就是说,相对于玩家的期望,风险只会增加。

人脑的这一特征对于赌博中赌场(等)的操纵尤其有吸引力(更多有关制造商的老虎机设备的信息[ 9 ])。
关于Jan Schreiber的平衡的文章,“第5级:概率和随机性完全错误”( 第5级,概率和随机性兜售 )[ 10 ],可以找到关于人脑错觉的更有趣的例子。

二。 随机数发生器


游戏中使用的术语“随机数生成器”(RNG /随机数生成器)实际上几乎总是表示“伪随机数生成器” [ 11 ]。 该发生器的主要特点是可重复性。 可再现性意味着,在知道初始生成元素(或种子)的情况下,将始终获得相同的随机数( 伪随机数)序列。 在某些游戏中,这种效果表现为以下事实:重新启动游戏后,命中和未命中的顺序保持不变。 但是在其他游戏中却不一样。

关键是如何使用该伪随机数生成器以及开发人员追求的设计目标。

为了更好地理解伪随机数生成器的工作原理,我们可以考虑在第一批经典游戏中实现它的方式,当时计算机(和游戏机)的资源受到特别严重的限制。 (有关示例及其功能的深入描述,请参见文章“经典游戏如何巧妙地利用随机数生成” [ 12 ]。

经典游戏如何巧妙地利用随机数生成[ 12 ]

最终幻想我使用了几个带有预定义固定数字的表,每个表中有256个值:

  • 为了计算游戏地图中每个步骤的随机战斗,算法在桌子周围移动,一次将索引更改为1,从而逐步滚动浏览所有可能的值-碰撞的事实和可能的对手群都取决于此;
  • 为了计算战斗结果,还使用了一个类似的表,其中包含256个固定值,但随着每次使用伪随机数,它的移动不仅发生,而且每2帧发生一次。 也就是说,算法每隔2帧就使表空闲地滚动编号,从而降低了预测相同序列的风险。 熵的来源是玩家在选择下一支球队之前会思考多长时间的不确定性。

最终幻想I使用表中固定值的序列号(索引)作为谷物(母体)。 即,知道进一步从中选择随机数的位置,就可以准确地预测经过1000次检查后将发出哪个随机数。 在更复杂的伪随机数生成算法中,grain不太容易使用,但是基本原理和效果仍然存在。

现在,为了生成伪随机数,主要使用所用编程语言的标准库。 当前系统时间最常被用作熵的来源。 对于游戏行业的需求,标准库的特性通常就足够了。 生成器和熵源的缺点由于其计算和操作的复杂性而很少被玩家使用。 通常,这里仍然有很多speedraner程序员( 例如,破解Pokemon Colosseum [ 13 ]的逻辑 ),这意味着开发人员更明智地忽略这些细微之处。

三, 使用生成器的不同方法


1.任务或游戏战役开始时谷物固定。

给玩家的后果 :重新加载游戏不会改变角色的遗漏事实(即使他命中的机率是99%,也可以称其为坚果Fidel )。 但是,在尝试击打之前,玩家可能会执行其他一些使用随机数的动作,例如,它类似于另一个角色- 光头Mick 。 结果,光头米克将使用不幸的随机数,而疯狂的菲德尔将使用序列中的下一个随机数-然后他可能会得到它。

玩家如何滥用它 :如果射门命中率达到50%,则可能会错过机会,您可以重新启动并尝试以更高的准确性(55%)进行攻击,直到击中为止。 命中后,保存并重复其他掷球。

对开发人员的积极影响

1)如果只存储初始状态,动作顺序和顺序,则可以逐步复制游戏。 因此,可以显示重复,甚至可以非常紧凑地存储保存文件。 该方法可以节省磁盘/内存上的大量空间。

2)保护内部赌博,以便保存/加载不允许玩家破产所有遇到的NPC对手。

一个例子

游戏roguelike Brogue [ 14 ]使用这种方法,从游戏世界的产生开始,到对所有玩家动作的错误计算结束。 结果,仅起始粒度和游戏命令序列存储在保存文件中。 这种效果的另一个好处是,在生成的Brogue世界[ 15 ]的表中选择了最有趣的世界之后,可以使用选定的粒数开始游戏。

Brogue roguelike-官方网站[ 14 ]

2.重启后每次都不会固定或更新颗粒。
对播放器的影响 :任何重新启动都会改变所有计算的机会。

玩家如何滥用它 :非常简单-多次重新启动以及最不可能发生的打击情况都可以成为现实。

对开发人员的积极影响

1)仅仅因为缺乏内部机制的知识,玩家才认为这种游戏更真实,更随机。

2)玩家会收到非正式的简易模式,如果需要的话,可以极大地方便复杂区域。

3)开发人员可以使用不同的方法来掩盖免费赠品:每个游戏一个自动保存(即覆盖保存和永久死亡)或在执行任务期间禁止保存(以不同的形式)。 尽管从技术上讲要困难得多,但是最敏感的区域(赌博迷你游戏)可以基于单个恒定粒数进行计算。

一个例子

韦诺之战[ 16 ]使用的是不固定的纹理,本质上是诚实的随机性。 诚实的事实是,有时可能出现完全不可能的失败序列,并且游戏引擎无法纠正它们。 其结果是恼人的玩家对游戏开发者的周期性愤怒帖子。

Reddit是韦斯诺斯的超级灵巧美人鱼[ 17 ]

同样,在进攻之前,游戏会提供进攻每种可能结果的概率的详细计算:造成的损害,所受到的损害以及一名对手死亡的可能性。 这些概率的结论只会增加“未成功相似”概率的愤怒,因为 确保有很好的攻击机会,因此很难获得千分之一的分数。

3.谷物不是固定的,结果本身还要进行其他处理。

通过操纵,我指的是这样的动态调整,其结果是,由于所得到的数字中实际伪随机性的损失,正确( 公平 )随机性的感觉增加了。

玩家的后果 :类似于具有不固定颗粒的游戏-重新加载可让您重新计算结果。

玩家如何滥用它 :在节省欺诈手段的帮助下,您可以选择有利的攻击组合,但这在很大程度上取决于实现方法和开发人员方面保护机制的可用性。

对开发人员的积极影响 :开发人员可以控制不良结果的稀有性,使外观“ 诚实随机 ”,增加和降低游戏的复杂性。 如果开发人员在计算击球机会时,分别存储并考虑了每个团队的触发,那么他可以大大减少滥用诈骗的可能性,从而确保玩家仍能获得算术平均伤害。

例子

开发人员Carsten Germer使用受控随机性功能来处理罕见事件和不仅事件[ 18 ]。 例如,为保证定期损失特别稀有的奖金(每10,000次机会中有1次机会),则在每次“未命中”之后按顺序增加机会:9,900分之一; 1至9800; 1到9700 ...依此类推,直到记录事件为止。 为了保证没有频繁的稀有性,他引入了一个附加变量,该变量在上次操作后的下10次检查期间将操作阻塞100%。

在我的《怪兽百吉饼》 [Gree]中,我还使用了随机操作。 通常,追逐受害者时,玩家的角色应该躲在他们身后,等待他们退后一步,落入自己的爪子。 通常,此机会在露天场所等于1/6(走廊为1/2,死胡同为1/1),但是为了减少特别不幸的情况的烦人影响,在15%的情况下,在对受害者的运动过程进行每次检查之前,都必须保证她会向格罗。

最有趣的情况是:在游戏《火焰纹章:绑定之刃》 [ 20 ]中,实施了确定攻击过程中命中率的隐藏机制[ 21 ]。 传统上,在系列赛中,游戏中击中的几率显示为从0到100%的百分比。 在该系列的较早游戏中,命中的事实由一个从1到100的随机数确定:如果辍学数(例如61)小于或等于命中的概率(例如75),则对命中进行计数(如果更多,则计为未命中)。

火焰纹章:绑定刀片[ 20 ]

在这一部分中,引入了备用系统:代替两个随机数的平均值,而取两个随机数的平均值,并将该平均值与精度值进行比较。 也就是说,随机数趋于更大程度地达到50的值,这导致了打击随机性的线性效应的扭曲:打击大于50%的战斗机的打击频率高于50%的情况,而打击小于50%的情况的频率更低。 而且由于在游戏中绝大多数玩家的角色更加准确,而大多数敌人较少,因此玩家获得了非常严重的隐藏优势[ 21 ]。 下图是这种效果的图表,其中蓝线表示旧系统中的命中频率,新线中红色的命中频率取决于攻击者准确性的百分比。 例如,显示的概率达到90%,实际概率将是98.1%,其中80%-92.2%,而10%-仅1.9%!

击球机会变形。 在y轴上,在x轴上的实际概率-显示给玩家

当然,这些并不是随机数和平衡操作的唯一示例,但是很难找到它们。 因此,这里的社区帮助将特别有价值。

我想指出的是,我并不将程序生成归因于可操纵的随机性。 示例:百吉饼产生了一个随机等级,其中包含一组随机的敌人,陷阱,墙壁和死胡同。 如果同时创建了一个无法通过的水平,那么将给出一个开发曲线示例,未充分考虑的设计或不良的测试。 开发人员必须在程序上检查至少随机生成的基本问题:

  • 到出口的通道必须始终至少为单数。 任何路径查找算法都可以帮助您;
  • 一系列陷阱应该能够绕过,如果一个地方存在太多陷阱,则算法必须计算其密度并去除不必要的陷阱;
  • 太强大的敌人必须提供至少一种“通过”他们的可用方法:蛮力; 卷轴和药水; 特殊文物或逃避它们的能力。

这种对随机结果的干预不是操纵,而仅仅是发展的最低能力方法的规则。 这些检查用于生成伪随机数的所有方法。

4.通常从游戏机制中删除随机性元素。

也就是说,每次攻击的结果始终具有100%的命中率和固定伤害几率,以及用于触发附加效果的恒定规则。 取而代之的是,您可以使用随机计算来达到装饰目的:定期“咀嚼”等待轮到的角色; 飞走造成的损害数量; 碰撞和爆炸的影响。 如何生成随机数以及如何均匀分布没有区别。

尽管在这种情况下,您可以在人工智能计算中使用前三种方法,但是当敌方角色在某种程度上可以随机选择攻击目标或以随机顺序进入团队时。 但这对于玩家而言将不那么明显,烦人的情况也将少得多。

播放器的后果 :重新启动不会以任何方式影响结果,或者会稍有影响。

玩家如何滥用它 :玩家可以在网络上计算或找到稳定的主导策略并仅使用它。 值得注意的是,对于某些类型的玩家,这是游戏的主要兴趣所在。

对开发人员的积极影响开发人员更容易平衡这种游戏。 不利的一面是,在这种情况下,新兴的主导策略变得稳定,这意味着即使玩家的运气不好也无法击败他,但却会导致意外,无聊和淘汰的游戏消失。 高水平的玩家几乎总是会赢得低层的玩家,对于各种类型的游戏,这既可能是优势,也可能是劣势。

一个例子

任何具有经典规则的国际象棋。

逻辑无赖也适用于此。 例如,该方法在Desktop Dungeons Alpha [ 22 ]中已很好地实现。

桌面地下城阿尔法[ 22 ]

在这里,攻击序列的结果始终是相同的,并且是预先计算的。 但是,由于游戏地牢的随机生成(过程生成)和战争迷雾的存在,游戏获得了最佳百吉饼的独特重播性。

结论


因此,本文考虑了游戏中随机性的两个子主题:

  • 概率估计中的错误假设 。 它描述了玩家做出的直觉假设,并且由于其主观性而常常被证明是错误的。 主要结论:真正的随机性不仅不能保证用户会满意,甚至会导致相反的效果。
  • 伪随机数生成 。 描述了使用随机性的不同方法。 成功的实施示例表明,无论选择哪种方法,游戏都可能产生有趣,出乎意料的效果,并具有良好的可重复性。

    明智地,一致地使用所选方法可以使开发人员强调自己的积极方面,并尽量减少消极方面。


Source: https://habr.com/ru/post/zh-CN432080/


All Articles