游戏概率算法
① C语言游戏中奖概率算法
从思想上来所,随机变量x有两个值,0表示不中奖,1表示中奖。如果进行N次实现,如果出现1的次数 / N = p%的话,我们说,x为1的概率为p%
STDLIB 中 rand() 函数的返回值,我们可以认为是服从平均分布的随机变量的值。通过不等式的变换,我们可以得到任意范围内,平均分布的随机变量。
比如说,20%的中奖率,我可以定义, 取[0, 99]的随机整数,如果该值为[0, 20) 则中奖,否则不中,那么中奖率就为 20%
② 诛仙概率计算问题
其实我还是喜欢用分数来表示!OK,开始:用对立事件来求结果!
不出现暴击的概率为82%,4次就是82%*82%*82%*82%=0.45212176,我们记为0.45即45%的概率一次不出暴,所以至少一次出暴击的概率为:P=1-0.45=0.55!
全部是暴击的概率P=0.18*0.18*0.18*0.18=0.0098496,是个小概率事件了!那么三个问题的答案分别是:P(1)=0.55 P(2)=,不说了,小概率事件 P(3)=0.45
顺便说下,这个是数学上的结果,天知道WMNC的算法系统在游戏里面是如何的精准!
③ 游戏掉宝概率的是怎么算的
宝物掉落有两种情况:1。如果并非强制掉落的话,那么这次掉落到上次掉落平均序列长度是(1+99)/2=50,而这种掉落的可能性是(1-1%)^992。强制掉落的话,那么这次掉落到上次掉落序列长度是100,而这种掉落的可能性是1-(1-1%)^99那么平均掉落的概率就是1/[(1-1%)^99*50+(1-(1-1%)^99)*100]=0.012267903816375 可以用蒙特卡洛法验证。
没错,你没看错,我说的不是“这个游戏系统内有钱,但是没有交易系统”,而是这个游戏系统内没有钱。游戏中不存在铜币、金币、银两这些东西,没有游戏币也没有人民币和美元,整个游戏都没有钱,根本不存在能够流通的单一通货!
没有钱那要怎么做交易呢?如果你是一个老暗黑2玩家,那你肯定会会心一笑。暗黑2是一个有金币的游戏,但里面的金币由于获得量太大用途太小几乎没有意义。于是,玩家们发现了乔丹戒指(SOJ)、寻宝护符(7% MF Small Charm)这些东西用于交易,用这些体积小掉率低价值高的东西交换其他自己需要的装备。这是个经典的货币形成例子,很多老玩家说起经济系统的时候都会怀念地谈起暗黑战网上的交易……但不管怎么说,暗黑2还是有钱的,而这个玩家自制的货币系统也是波动巨大而不稳定的。
而在POE中,他们设计了一个很有趣的系统:他们设计了一套由多达23种可消耗货币道具组成的、可以一定程度上互相汇兑的货币系统。这个系统内,几乎每一种货币道具都有其实际的用途,在游戏的装备打造体系中占着一个重要的位置,不会像D2里面的那些物价装备一样面临着价格的巨大波动和货币道具的沉积。游戏的道具出售系统则也有类似的设计:只要玩家积攒一定数量、种类和组合的装备卖到店里,就能获得对应的货币道具作为稳定供应来源。更有趣的是,这个货币道具系统天然内置了课税系统:任意两种货币道具之间的汇兑其实都有潜在的损失量。
④ 游戏攻击判定的三种模式
转自:http://www.gameres.com/677620.html
攻击判定流程几乎是所有包含战斗玩法的游戏都无法绕过的一块内容,常见的攻击判定流程有瀑布算法、圆桌算法以及混合算法三种。本文简述了这三种判定流程的特征,以实例对比分析了瀑布算法与圆桌算法各自的优点,以期为后续其他战斗数值设计内容的论述提供一定的基础。
攻击判定流程概述
自此开始正文内容的叙述——让我们直接代入一个实例:
在一款游戏中,攻击方有命中率和暴击率两个攻击属性,而防守方有闪避率、招架率和格挡率三个防御属性。于是相应的,一次攻击有可能产生6种判定结果:未命中、普通命中、闪避、招架、格挡和暴击。当采用不同的判定流程进行攻击结算时,6种判定结果出现的频率会截然不同。
1. 瀑布算法
顾名思义,在瀑布算法中,各事件的判定顺序如同瀑布一般自上而下。如果“水流”在某个位置被截断,则后面的流程都将不再继续进行。据我所知,瀑布算法是大多数游戏所采用的攻击判定算法。
上述实例若采用瀑布算法,则会以如下方式进行判定:
先判定攻方是否命中
再判定是否被守方闪避
再判定是否被守方招架
再判断是否被守方格挡
最后判定该次攻击是否为暴击
瀑布算法流程图
由此我们可以得出:
瀑布算法特征1:多次掷骰,一次掷骰只判定单个事件的发生与否
瀑布算法特征2:后置判定依赖于前置判定的通过
注:有的游戏会将命中和闪避合并在一次掷骰中判定,这意味着将攻方命中率与守方闪避率合并计算出实际击中概率后再进行掷骰判定,仍是瀑布算法
我们再代入一些具体的数值,设攻守双方角色的面板属性如下:
攻方命中率=90%
攻方暴击率=25%
守方闪避率=20%
守方招架率=15%
守方格挡率=30%
按照上述的流程判定,6种判定结果将会按如下的概率分布:
实际未命中概率=1-命中率=1-90%=10%
实际闪避概率=命中率*闪避率=90%*20%=18%
实际招架概率=命中率*(1-闪避率)*招架率=90%*(1-20%)*15%=10.8%
实际格挡概率=命中率*(1-闪避率)*(1-招架率)*格挡率=90%*(1-20%)*(1-15%)*30%=18.36%
实际暴击概率=命中率*(1-闪避率)*(1-招架率)*(1-格挡率)*暴击率=90%*(1-20%)*(1-15%)*(1-30%)*25%=10.71%
实际普通命中概率=命中率*(1-闪避率)*(1-招架率)*(1-格挡率)*(1-暴击率)=90%*(1-20%)*(1-15%)*(1-30%)*(1-25%)=32.13%
瀑布算法的判定结果分布
由此我们可以得出:
l 瀑布算法特征3:各事件出现的概率符合经典的概率计算方法
l 瀑布算法特征4:掷骰轮次越偏后的属性衰减程度越大,但不会出现无效的属性
2.圆桌算法
将所有可能出现的事件集合抽象成一个圆桌桌面,便是圆桌算法这一称呼的由来。圆桌算法的实质,是将所有可能发生的事件状态按优先级依次放上桌面,直至所有事件被放完或桌面被填满。圆桌算法正是史诗级巨作魔兽世界中所采用的算法。据笔者了解,使用该算法的游戏并不多见,但即便仅魔兽世界这一款,已足以使这种算法成为永恒的经典~
上述实例若采用圆桌算法,则会用一次掷骰判定该次攻击的结果。
圆桌算法流程图
圆桌算法的操作步骤可以归纳为:
(1)攻方角色的命中率决定圆桌桌面的大小
(2)将各个事件状态按优先级依次放上桌面,直至所有的事件均放置完或桌面被填满
(3)若桌面还未填满,则用普通命中填满空桌面
将先前设定的数值代入,6种判定结果将会按如下的概率分布:
实际未命中概率=10%
实际闪避概率=20%
实际招架概率=15%
实际格挡概率=30%
实际暴击概率=25%
实际普通命中概率=90%-实际闪避概率-实际招架概率-实际格挡概率-实际暴击概率=90%-20%-15%-30%-25%=0%
注:在上述计算中,优先级按如下排序:闪避>招架>格挡>暴击>普通命中
圆桌算法的判定结果分布
可以看出,由于普通命中的优先级最低,所以它被完全挤出了桌面。这意味着,若攻守双方以此数值模型进行对决,则攻击方的攻击结果中将不存在普通命中。
由此我们可以得出:
圆桌算法特征1:一次掷骰即得出该次攻击的判定结果
圆桌算法特征2:事件有优先级,圆桌放满后优先级低的事件将被挤出桌面。这意味着那部分溢出的属性将不再生效
圆桌算法特征3:圆桌内的各事件出现概率不会衰减,只要优先级低的属性没有被挤出圆桌,各种事件的实际发生概率就与面板属性数值吻合
3. 混合算法
这是一种先判定攻方事件,再判定守方事件的判定流程。笔者曾在一篇帖子中看到过这样判定流程,不确定是否有实际的游戏应用,故仅在此做一些简单的理论分析。
混合算法在单方事件的判定中采用圆桌算法,即:
攻方判定结果:普通命中OR未命中OR暴击
守方判定结果:闪避OR招架OR格挡OR被命中
混合算法流程图
注:上面这个图仅作示意之用,从流程图的角度来看可能不太严谨
将先前设定的数值代入,6种判定结果将会按如下的概率分布:
实际未命中概率=10%
实际闪避概率=攻方命中率*闪避率=90%*20%=18%
实际招架概率=攻方命中率*招架率=90%*15%=13.5%
实际格挡概率=攻方命中率*格挡率=90%*30%=27%
实际暴击概率=攻方暴击率*敌方被命中概率=25%*(1-20%-15%-30%)=8.75%
实际普通命中概率=攻方普通命中概率*敌方被命中概率=(90%-25%)*(1-20%-15%-30%)=22.75%
混合算法的判定结果分布
由此我们可以得出:
混合算法特征1:先判定攻方事件,再判定守方事件,共进行两次掷骰
混合算法特征2:先在单方事件的判定中采用圆桌算法,再用瀑布算法串联攻守双方事件
混合算法特征3:会产生并发动作,例如暴击被闪避等
注:这也正是实际暴击率较低原因所在
瀑布算法与圆桌算法的特性对比
在上一块内容的铺垫之下,我们不妨继续以魔兽世界中的攻击判定流程设计实例作为切入点,对比分析一下圆桌算法与瀑布算法各自的特性。
(1)面板属性传递信息的直观性
瀑布:由于各属性在判定流程上的生效时间有先后之分,所以各属性的实际效用与面板显示的不符。
圆桌:由于属性的判定没有先后之分,只要没有属性被挤出圆桌,则所有属性的实际效用与面板显示的相当。
这里可以看出圆桌算法的优点:
属性的实际效用与面板显示相符显然更易于普通玩家的理解,便于玩家掌握自身的战力情况。
(2)属性的价值
瀑布:掷骰轮次越偏后的属性衰减程度越大,但所有的属性均会生效。
圆桌:只要没有属性被挤出圆桌,则不存在属性效用的衰减。
这里可以看出圆桌算法的优点:
由于不存在判定流程上的先后,所以各属性的实际价值会比较接近,一般不会出现玩家堆了某个判定流程靠后的属性结果很废的情况。
同样也可以看出其缺点:
一旦有属性溢出,则该部分属性的效用为0,完全没有价值。
(3)相同面板数值下的生存能力
圆桌:在面板数值相同的情况下,魔兽世界用圆桌算法大大提高了坦克角色的生存能力,使得他们可以应对来自首领怪的超高攻击,匹配大型团队副本的玩法设计。
瀑布算法下,免伤概率=18%+10.8%+18.36%=47.16%
圆桌算法下,免伤概率=20%+15%+30%=65%
传统的概率为相乘关系,圆桌为相加关系,后者的概率总和要大的多
并且,当防御职业将三维堆至一个阈值(70%)后,配合技能可达100%的免伤覆盖,将命中和暴击全部挤出桌面,从而衍生出特定的玩法(70级年代伊利丹的剪切技能)。
瀑布:相同的面板数值在瀑布算法的框架下,免伤概率相较于圆桌算法要低得多。换言之,角色达到相同的有效生命值,所需的免伤属性要高得多。
这里可以看出:
在圆桌算法的框架之下,属性投放若是脱离了控制超过了阈值,将对平衡性产生较大的冲击(70级的盗贼单刷格鲁尔——当然在暴雪光环的作用下,玩家会认为这是精妙的设计~)。
在国产游戏收入导向的大环境下,设计者是否能顶住收入压力,严守属性投放的极值不越界,是值得慎思的问题。采用瀑布算法,能有更大的数值空间用于能力投放,更为适合现阶段的市场环境。
(4)运算量
瀑布:多次掷骰
圆桌:单次掷骰
显而易见:
掷骰次数越多,运算量越大。圆桌相较于瀑布,有着相对较小的运算量。简单即是美。
注:除魔兽世界外,《冒险与挖矿》的技能施放也采用了圆桌算法,大大简化了技能施放的判定流程。可以想象一下,一次攻击至多发动一个技能。而每一次攻击,一个队伍中有几十个角色的技能施放需要判定,如果采用瀑布算法,将产生多大的运算量。
思考与总结
对战斗数值的研究,应该基于理论推导而归于实践应用。毕竟游戏数值设计不是做数学研究,其本质应是一种体验设计。最后希望交流的是笔者个人对于这两种算法的一些理解。
(1)不同的攻击判定流程会向玩家传达不同的战斗感受
究其本质,不同的攻击判定流程,影响着一场战斗中的各种攻击判定结果将以何种概率分布出现。
假设在一款游戏中,闪避率的投放上限是30%,暴击率的投放上限是40%,命中率的投放上限是100%。瀑布算法下,出现闪避、暴击和普通命中的概率是30%、28%和42%;圆桌算法下,则为30%、40%和30%。这两种不同的概率分布,必然会带给玩家不同的战斗体验,但在缺少其他条件的情况下,并不能判断孰优孰劣。
使战斗体验匹配游戏的核心玩法,使属性投放的极限值能满足游戏的商业化需要,是设计攻击判定流程时首先要考虑的。
注:甚至于部分竞技游戏强调公平性,将暴击做成了伪随机。
使用瀑布算法,则不应该设计种类繁多的事件状态
若是仿照魔兽世界的做法设计一连串的事件状态(未命中、闪避、招架、格挡、暴击、普通命中、偏斜、碾压),非但运算繁杂,而且后置判定的属性衰减幅度较大,效果极不明显。这种隐晦的设计将不易传达,同时还会影响玩家的游戏感受(某个判定流程靠后的属性堆得很高结果却没用)。
使用圆桌算法,则应该严守属性投放的上限,防止平衡崩坏的情况发生
需要澄清的是,并不是说使用瀑布算法就可以无限投放数值,而是说,相较于瀑布算法,圆桌算法的属性投放上限会低很多(免伤概率的相加与相乘)
(2)不同的攻击判定流程将影响有效生命EHP和有效攻击EDPS的表达式
几乎每个数值策划都会将角色的属性转化为EHP和EDPS以衡量其的战斗能力,但曾见过不少人对所有的游戏都用统一的EHP、EDPS表达式进行分析模拟。这种偏差较大的模拟方式必然会影响体验设计的精准性。在不同的攻击判定流程之下,EHP与EDPS有着截然不同的表达式,举例说明如下。
瀑布算法下:
若命中闪避分两次判定:
EHP=HP/(1-免伤率)/(1-闪避率)/(1-招架率)
EDPS=DPS*命中率*[1+暴击率*(暴击伤害倍率-1)]
若命中闪避合并判定:
EHP=HP/(1-免伤率)/(命中率-闪避率)/(1-招架率)
EDPS=DPS*(1+暴击率*(暴击伤害倍率-1))
圆桌算法下:
EHP=HP/(1-免伤率)/(1-闪避率-招架率)
EDPS=DPS*[命中率-敌方闪避率-敌方招架率+暴击率*(暴击伤害倍率-1)]
注:闪避、招架>暴击>普通命中,且各状态发生概率之和未超过圆桌大小
混合算法下:
EHP=HP/(1-免伤率)/(1-闪避率-招架率)
EDPS=DPS*[命中率+暴击率*(暴击伤害倍率-1)]
可能有人会觉得:模拟得这么准又有什么卵用,数值平衡最后还不是靠调?诚然,在数值设计领域,确实有名言曰:数值平衡是调出来的。但在笔者看来,调节应该建立在正确的理论推导的基础之上。依靠调节来掩盖数值模型的错误设计,是本末倒置的行为。即便达到了所谓的平衡,也不过是扭曲的平衡,会为后续版本的迭代埋下隐患。
写在最后
市面上的大多数游戏,都不会设计复杂繁多的攻击事件,且基本采用瀑布算法。如此看来,攻击判定流程的设计十分简单。那么为什么要大费周章地将简单问题复杂化呢?
爱因斯坦曾说过:Everythingmust be made as simple as possible, but not one bit simpler——凡事应该力求简单,但不能过于简单。从了解一种数值设计方法到理解如此设计的目的,从模仿成功游戏的数值设计到理解其设计的内在意义,这是每个数值策划成长的必经之路。
从全盘照搬一种数值体系到能够融会贯通并根据实际情况灵活运用,这是一条并不好走的路。知其然,也应知其所以然——这是一个入行一年有余的新人的一点感悟。
免责申明:
1.笔者无法保证本文所用词汇的普适性,能力所限,请多包涵~
2.不保证文中魔兽世界实例中的设定均与原作完全相符。但即便不相符,也不会影响圆桌理论的推
⑤ 10人抽奖至少3人中的概率
概率是30%。
算法是用3/10*100%=30%,所以10人抽奖至少3人中的概率是30%。
概率是指某一事件在相同条件下可能发生也可能不发生,表示发生的可能性大小的量。概率的算法是:用事件数除以可能结果数。所得结果即为单一事件发生的概率。
⑥ 扑克概率计算
这个题有点难度,因为是6个人的游戏,不知道外面和你拿同花的有几张。一共13张同花,每人两张底牌,三张公共牌,一共30张牌。如果其他人25张牌和你拿的底牌同花达到了13张,那么你第三张是同花的概率为0,如果达到了12张,剩余的25张牌里,只剩一张,你第一张公共牌得到的概率为1/25,第二张概率为1/24,第三张概率为1/23,得四张同花概率为0。如果其它人手里没有和你底牌同花的。剩余25张牌里还有11张同花,你第三张得到同花的概率为11/25,如果你第三张得到了,第四张得到的概率为10/24,如果第三张没得到,第四张得到的概率为11/24。这个题有点难度,因为是6个人的游戏,不知道外面和你拿同花的有几张。一共13张同花,每人两张底牌,三张公共牌,一共30张牌。如果其他人25张牌和你拿的底牌同花达到了13张,那么你第三张是同花的概率为0,如果达到了12张,剩余的25张牌里,只剩一张,你第一张公共牌得到的概率为1/25,第二张概率为1/24,第三张概率为1/23,得四张同花概率为0。如果其它人手里没有和你底牌同花的。剩余25张牌里还有11张同花,你第三张得到同花的概率为11/25,如果你第三张得到了,第四张得到的概率为10/24,如果第三张没得到,第四张得到的概率为11/24。这个题有点难度,因为是6个人的游戏,不知道外面和你拿同花的有几张。一共13张同花,每人两张底牌,三张公共牌,一共30张牌。如果其他人25张牌和你拿的底牌同花达到了13张,那么你第三张是同花的概率为0,如果达到了12张,剩余的25张牌里,只剩一张,你第一张公共牌得到的概率为1/25,第二张概率为1/24,第三张概率为1/23,得四张同花概率为0。如果其它人手里没有和你底牌同花的。剩余25张牌里还有11张同花,你第三张得到同花的概率为11/25,如果你第三张得到了,第四张得到的概率为10/24,如果第三张没得到,第四张得到的概率为11/24。
⑦ 计算22选5的概率,需要详细公式
22选5玩法中
全排列共26334
22*21*20*19*18/5/4/3/2/1=26334
相信楼主也会算
一等奖中奖概率就是26334分之一
楼主也知道
但是搂住不知道的是22选5中3个的中奖概率有点糊涂了,我解释一下:
22个号码中三个一组共有1540组,其实搂住已经混淆了概念,你所算得是相当于22选3玩法(22选3
假如中3个是一等奖)的中奖概率。
具体算法
我们是从22个中选5个,一注单选5个数,中三个就是5个当中中三个数学表示就是C
5
3
(5*4*3/3/2/1=10),另17个数中有两个是没中的,就是17选2
C
17
2
(17*16/2=136),在用10乘136=1360就是这么多中组合了。因为全排列有26334种,即1360/26334,约19.3632............即1/19
中4个的[C(5
4)*C(17
1)]/C(22
5)----
85/26334
约309.8
即310分之一
虽然废话太多,但是讲得清楚
⑧ 我想问一下关于崩坏3保底的概率计算的问题
1000次不会有124次,这个是在无限样本的前提下。而1000次相对于无限太小了。比如说出货率是10%无保底,那你能说抽10次必定出货吗,并不能,你抽取时有0.9∧10的概率约0.34的概率不出货,而出货的概率实际上是1减去它。而引入保底机制后,我们的概率发生了变化。这里需要考虑如何编程的问题,通过编程我们了解到其实就是加入了一个记录变量,当出现紫色时清空它,重新计数,当记录变量加到第10次未出现紫色则该次概率变为100%。那么概率就变为10次为周期分类讨论是否出现保底事件的条件概率问题。假设单次设定出货概率x=0.1,令触发保底事件为A,出货为Y,不出货为N。那么第一次抽取概率出货0.1,不出货0.9。类推过去触发保底事件A的概率是P(A)=0.9∧9,不触发保底事件的概率P(1-A)=1-0.9∧9。两者出货的概率分别为100%和1-0.9∧9。那么p(Y)=0.9∧9+(1-0.9∧9)∧2为实际出货概率。可以得出计算公式。若给出的为实际概率p(Y),设设定概率为x回推即可。