onresize事件会被多次触发_伪随机分布与游戏中的随机事件

4aeaf89ac63e913f7911d4f96a4a7104.png

近期虽逢春节假期,但正值疫情严重,不宜出门。写下此文也希望能作为一篇家中读物,消磨时间。


概率,在各种有着“角色”与“技能”设定的游戏中,是用于设计技能的常用工具。常见的“暴击”、“击晕”等都大多是概率性触发。概率的存在,避免了只能设计为“有”或“无”的一刀切,使得通过触发频率进行平衡性调整成为了可能。

然而,这类概率事件是否触发并非完全的随机,而是使用一种被称为“伪随机”的方式。早在初中时我便听说了“随机种子”的存在,当时就奇怪,这种存在使得随机失去了无法预测的特性,从而丢失了随机的意义。后来直到大学,在通信的加密中接触到了伪随机的概念,只是仍然对于相关知识死记硬背,未能理解到其意义。直到现在结合一些对游戏机制的探究,才理解了伪随机存在的意义。

▶ 伪随机序列

把需要随机判定事件简单地看为抛硬币。那么在使用伪随机设定游戏过程中,进行一次抛硬币,并非玩家即时抛一枚硬币查看正反结果,而是有别人很久以前就抛过的硬币,此时的游戏只是将那时的结果予以复现。

只是,一场游戏不会只有一次随机事件判定,因此恒久以前的那次抛硬币也不会只抛起一次,而是有着理论上近乎无限次。这无限多次分为很多轮,每轮中的所有硬币正与反的结果构成一条顺序,这条顺序就是“伪随机序列”。

每一轮抛硬币对应一条伪随机序列,总共n轮就有n条伪随机序列。而开启游戏时,会从这n条序列中选取一条,作为本场游戏中所有硬币正反的依据。这次选取,才是真正的随机,是真正的不可被预测的独立事件。

▶ 为什么要用伪随机序列?

只要有一些数理意识就会敏感地发现,如此简单地复现以前的结果是破坏随机的不可预测性的。事实也的确如此。但伪随机序列存在的最大优越性在于,平衡随机的分布。由于每一条序列都可以被观察并筛选。这个筛选过程可以帮助剔除掉一些极端情况,如在游戏中可体现为“一直不暴击”和“一直连着暴击”。筛选掉极端情况,以此使得玩家感受到的触发概率与设定上的相等,以此保护玩家体验

至于伪随机的唯一缺点,可借由增加伪随机序列总数,即前文提及的n来解决。如果要借用伪随机的特性来“预知未来”,前提是要保证未来和已知的“时间线”完全相同。而当n的数值越大,对于一名玩家而言就越难遭遇两次相同的伪随机序列,越难出现“时间线”相同。

▶ 应用伪随机序列

首先是伪随机序列的选取。这次选取会是一个真正的随机,会调用随机函数来处理,选择的依据可以由时间、硬盘序列号等来组成,组成的依据被称为“随机种子”,可以理解为诸多时间线的序号。随机种子一般默认使用时间。在游戏以外的一些场合,如果对随机的不可预测性要求更高,可以采用更为离谱的客观变量,例如网站http://random.org/使用大气噪音生成随机数。但是,用计算机模拟的就不可能是真随机,只能尽量模拟不可近似性。

其次,游戏中的随机事件多,概率并不均等,因此对于它们是否触发的判定无法直接调用相同的序列来解决。但是,如果概率之间存在倍数关系,则可以通过考察序列中多次值来进行判定。举例说明:假定有一伪随机序列,包含0与1,分布概率各位50%。则用于50%概率事件判定可直接调用作为判定依据;用于25%概率事件判定则可每2位作为一次判定依据。

cc64a831d3d000dd83693081e87fdf23.png

不过,某些概率值将占用序列中的很多位来计算,甚至有些不可转化为分数的数值无法计算。为了计算方便,多数游戏中随机事件触发概率会有不少的相等数值和倍数关系数值;以及,许多公布的数值很可能经过取整,与实际值不等。

当然,上述举例中不同概率事件采用了同一伪随机序列,实际上也可以采用不同的序列。

除此以外,因为伪随机序列是经过筛选保证总体分布均匀的,故每次判定不再是独立事件了。这意味着,如果出现连续多次不触发,下一次触发的概率就大大上升了。反之,触发一次过后的下一次,连续触发的可能性就大幅降低了。

▶ 在明日方舟中预知未来

游戏《明日方舟》中有一种名为“代理作战”的存在,意味记录玩家的操作过程并复现来实现自动作战。但是实际上被复现的不只是玩家的操作,还有伪随机。而且每次作战只会采用一条伪随机序列,被所有角色和技能共享。这使得“预知未来”的难度大幅降低,借由“预知未来”获益的门槛也大幅降低。通过控制一条序列中的判定依据分配,可以使得集中在某些情况下的概率事件判定全部判定为“触发”。说得通俗一些,先行测试一条伪随机序列,定位序列中一段有连续多个“1”的位置,再通过使用别的概率事件把这段位置前的所有位顶掉,可以实现某位干员在吃到Buff后的每次攻击都触发暴击。

▶ 不是一条序列,而是实时算法

借由这种破坏掉随机事件独立性,也可用于算法主动生成伪随机序列,这就是“伪独立叠加”。譬如一个概率的事件,首次判定时设定概率为C,若不触发,下次判定时变为2C,以此类推,第N次P(N)= C×N,直至触发后,再将此概率重置为C。只要保证基于该算法下的宏观上触发概率与真随机需要的概率相等,这一方式便不破坏平衡性。这样使用算法就不会占用预置伪随机序列的存储空间了。

事实上,现下多数竞技性游戏中涉及的伪随机也是采用这种或类似方式,而不会真的去构建一堆庞大的、保密的伪随机序列,例如Dota2:

Random distribution​dota2.gamepedia.com
21c794ab5dc09612dd82521d66b4d4c0.png

至于上文提到的明日方舟,实在是少数。这也应该与游戏过程中需要进行随机判定的次数有关。明日方舟最持久的作战应该是剿灭作战,一般20~30分钟左右,可带入干员12位,轮流上场,有天赋和技能两种可能涉及概率的需求。而Dota2一般30~40分钟,10名英雄同时上场,有4个技能和无法肯定数值的装备,除此之外野怪等也拥有技能,线下版本还要考虑野怪掉落装备的概率,总体涉及概率事件的量相当庞大。

因为第N次的概率为C×N,且N为自然数,所以必定存在N使得C×N ≥ 100%,即必定触发此概率事件。例如Dota2触发率为35%的技能“剑舞”,第七次触发概率为112%,八次不暴的可能性直接从游戏机制的层面被彻底移除了。这也是前面所述的避免极端概率事件出现的一种体现。

▶ 游戏以外

除了游戏以外,几乎所有涉及“随机”的地方都有伪随机的使用空间,比如音乐播放软件的随机播放功能。可以查到新闻,iTunes以前使用的是每次独立的随机,遭用户投诉后改为伪随机。不过显然,这里的伪随机并不需要上一节的那种叠加法,而是简单地将播放列表乱序即可。这也是除了先生成、后筛选以外,另一种生成伪随机序列的常用方式:洗牌法。

再例举一处我个人很赞赏的应用方式:模拟现实。随机虽为随机,但也可以有分布上的要求,例如高斯、泊松等。在用于模拟现实的作业中,这种“带有条件的随机”是广泛存在的。模拟一片墙壁,何处干净,何处着灰?模拟一片草地,何处泥土,何处芳草?而伪随机使得筛选随机结果使满足要求成为了可能。Cinema 4D中的噪声着色器便是伪随机,可以借由“种子”模拟不同的随机结果。此处有一个Cinema 4D中,把噪声着色器生成的二维纹理作为三维置换贴图加以演示的案例,可以用于感受什么是“带有条件的随机”:

C4D噪声着色器的32种形式完美展现_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
11111937d4c19e279fe9a24b4e99362b.png

【完】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值