判断随机抽取代码_【策划进阶】游戏设计中的伪随机

G    A    M    E     S    H    A    R    K

de230f5f4e9f1317e1136b0279497890.png

|游鲨游戏 / | 网络/原创

fcd42f5af6fdb67dfb6f1080f0f778e1.png
前文传送门:【策划进阶】游戏设计中常用的概率分布

策划:我跟别人PK的时候连续打了20几下,怎么没有一次出暴击啊?他一反手扔我三个技能,个个暴击...你赶紧帮忙看看是不是随机数出问题了?

程序:随机数没问题的,每次都是随机的,你运气不好,他运气好而已...

策划:没有运气一说啊,他运气好又不会感恩游戏,给我们充钱,但运气不好的是有可能发贴骂娘,甚至退游的啊!我听说你们用的是伪随机数,我们能不能用真正的随机数啊?你能不能让它不要连续暴击,以及不要连续那么多次不暴击啊...

ed7f286276290709de3916658aea61f2.png

程序:你理解的伪随机和程序理解的伪随机不是一个概念。

伪随机不是假的随机,而是指随机数在特定周期内重复而已。伪随机数发生器计算机利用一定的算法来产生的,由特定的种子生成一定长度的不重复的随机序列。计算机的代码,算法是确定的,不可能生成真随机数。

真随机是指通过真实随机事件取得的随机数。比如利用不可预知的物理方式(噪音、放射性衰败、宇宙射线的触发时间、脑电波等等)来产生的随机数。这样的随机数序列是不可预知的,也是永不重复的。一般来说,真随机数的产生代价较大,运算速度较慢,常规的工程应用中几乎没人使用。

策划:……

0540555674b68e05aa5df04d5683bfbb.png

我希望的随机分布是这样的:假设游戏中暴击率是15%,我希望每100次攻击中出现15次暴击,或者说20次之内会出现3次暴击,然后这些暴击的出现呈相对均匀的分布,要避免连续的暴击或者连续很多次的不暴击。我说清楚了么?

程序:问题是随机函数只在大数据量的情况下满足随机分布,并不在有限的次数内呈现随机分布,越是少的次数,分布可能越差。 

策划:我理解,但是你要考虑一下玩家的感受。就以15%暴击率为例,连续10次不暴击的几率高达19.69%,连续20次不暴击的几率也有3.87%。玩家遇到这种情况,是要骂策划司马,甚至退游的。

d0d1cd36a49b5fa1de82d7b253749fc2.png

程序:那只能在逻辑上层人为干预,比如限制每天服务器掉落神兽有且仅有一只,每个玩家在某个活动中最多只能获得一个神兽,等等。

策划:这种逻辑很繁琐,而且会影响到玩家对于活动的预期,一旦某天已经在服务器刷出神兽,那么其他玩家可能就不会再参与这个玩法,直到周期被重置。

程序:有一种叫做random shuffle的算法,简单来说就是洗牌算法,音乐播放器的随机播放就是采用这种算法。这个算法的原理是将(0, M)个数字随机打乱,形成一个序列,它必定满足随机性及在(0, M)之内的均匀分布。然后,我们每次从中抽取一个数值,与我们期望的数值进行比较,从而判断是否命中。比如15%的概率,可以简化为在(1, 100)中抽取一张,如果小于等于15,那么就命中。当然,我们也可以用(1,20)中抽取小于等于3的数值作为命中。

策划:好像也不是太行,这种算法每次都要把牌发完,才允许重置序列,这样只能在小范围内保证随机分布的均匀。为什么Dota里面玩剑圣的时候就不会出现连续10几次不暴击的情况?

程序:因为War3引入了一种叫做presudo random distribution,即PRD算法,记录随机数的上下文,用于人为的干预随机数的产生,使得随机数可以按照期望的规律在较小的次数内呈现较为均匀的分布。通过这种方法,甚至可以模拟出完全的抽取式的随机,比如20%的几率即意味着,5次里面必然出现并且只能出现1次...

611629441cf2fd572efc26d203273171.png

策划:有点意思了,展开讲讲。

程序:在WAR3中,一个暴击率20%的英雄,并不是每一刀都20%暴击率,而是以5.57%作为初始暴率,如果第一刀不暴,则第二刀的暴率增加到初始值的2倍,即11.14%;如果还是不暴,就继续增加到初始值的3倍:16.71%,以此类推。而如果在这个过程中任何一次攻击打出了暴击,就会把暴击率重置到5.57%。

它的简单原理就是把一个以x几率发生的事件初始设置为c几率,如果没有命中则下一次的几率增加c即为2c,3c,4c...直到nc,那么最多不超过 (1/c+1)的次数就必然会命中。一旦命中以后几率重设为c,依次继续计算以后的随机数。这个算法的关键点就是如何计算c=f(x)。可以用程序算出c和x的对应关系以后进行拟合,然后根据拟合函数再来求解我们需要的随机几率所对应的c。根据PRD得出的结果,基本不会出现连续20次不暴击的情况。

策划:对啊,这才是我想要的随机效果!

程序:这个算法最大的问题是如何保存它的上下文。我们必须要清晰的定义概率事件的边界,比如物品掉落应该需要对每个玩家的每种掉落保留一份上下文,否则玩家之间的概率就会互相干扰,进而影响玩家的感知。

这看起来是比较夸张的,我们需要做出选择,只对最重要的事情进行干预。部分数据可能需要存盘,也可以通过某个渠道显示给玩家,表示某种进度。这个算法也不只是用在暴击/掉落上面,在合成宝石、强化等系统所有对随机分布均匀性敏感的高价值系统都可以考虑。 

策划:这个可以,但你说这样会不会就不刺激了呢?阴阳师那么多非酋百抽啥也不给不也还玩着么?

2ccd17a84d77164fb417f02376991b1b.png

程序:……

bdef178024da0b801eb1bde4d55c5319.png

往期精选:

 游戏开发全是男人的天下?盘点爆款游戏背后的女性制作人 专注爆破40年--游戏开发中的破碎系统 国内最吸金的游戏公司介绍(下)

ec0f662d1418c0e5c7e5e7ed4bb527d2.gif
转载请与游鲨游戏圈官方客服联系
d46a65e2f4b539cc036c0f930b382b45.png

平台简介

149f7b4084e4f4224040185265fcd048.png

游鲨游戏圈,专注游戏策划知识分享,校招 & 社招零基础入行辅导、在职策划能力进修。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值