首页 > 资料专栏 > IT > 互联网 > QQ > 腾讯_游戏的概率计算(一)PDF

腾讯_游戏的概率计算(一)PDF

pengyou***
V 实名认证
内容提供者
热门搜索
腾讯
资料大小:548KB(压缩后)
文档格式:PDF
资料语言:中文版/英文版/日文版
解压密码:m448
更新时间:2023/4/12(发布于江苏)

类型:积分资料
积分:10分 (VIP无积分限制)
推荐:升级会员

   点此下载 ==>> 点击下载文档


文本描述
游戏的设计过程中经常涉及到概率的计算,这些实际问题有的简单有的复杂,有些看似 简单的问题实际上需要复杂的计算,反过来,有些看似复杂的问题却又有简单的计算方法。 而概率的计算,往往又因为思考角度不同,会有截然不同的解答方式,整个过程一个思 考或计算偏差将导致这些计算结果的天差地别(如各种强化期望次数的计算,不同计算结果 可以差出数百上千倍)。 这种情况下,如果有一种普适性的(可应对尽可能多的实际问题)、稳定的(计算步骤尽量 少,计算不易出错)计算方法,就好了。 在对这个问题的长久思考下,发现有 2 种方法,在游戏的概率计算时,可以通用:1. 循环模拟;2.函数递归。 这两种方法都借助计算机进行计算,所以能尽量的减少计算中的步骤和人工计算,降低 了出错机会。这 2 个方法也几乎不需要数学公式,公式越多越容易出错。理论上早期教材的 高中数学(貌似现在初中就开始教了)的排列组合知识就足够掌握着两种方法了。 先以一个相对简单的计算作为实例:《魔兽世界》的副本 Boss 伊利丹掉落埃辛诺斯战 刃(蛋刀)的主/副手,主副手的掉落概率分别为 pa 和 pb,求集齐一套蛋刀平均需要击杀多 少次伊利丹?若无特殊说明,本文蛋刀主副手的掉落互斥,即 ab 不会同时掉落。 1. 循环模拟法 这个方法最为简单和粗暴,略有 vba 或其它语言基础的同学们都可以使用。但也因此这 个方法往往被人诟病——技术含量低、结果不精确、计算效率低。 这个方法的原理很简单,以上述蛋刀套装的计算为例,使用 2 层循环,内循环使用一个 Do while 循环语句,在循环主体中使用一个变量对 Boss 击杀次数累加,并使用一个随机数 模拟 Boss 的掉落结果。 在上述例题中,当蛋刀主/副手的掉落都为真时,则退出内循环,在外循环的 For ..to.. 语句中,进行指定套数的蛋刀套装收集的模拟,用内循环的计数总和/指定的套装套数,得 到平均一套蛋刀需要击杀的 Boss 次数。 基本逻辑伪代码主体部分如下: pa=0.1 pb=0.5 raids=0 For set=1 to 1000000 seta=False setb=False Do while seta!=True and set!=True ‘循环体 ‘模拟一次掉落 ‘生成一个随机数 rd=Randbetween(1,100) ‘根据这个随机数,判断 a/b 本次的掉落情况 seta=Or(seta,rd>pa*100) setb=Or(setb,rd>pa*100&&rd<(pa*100+pb*100)) raids=raids+1 … loop … raids/1000000 … vba 很好学,24 小时真的可以通关(满足工作需求绝无问题),多练习就可以。 上述的方法无法使得每个人都满意,比如,当条件改变时——收集 3 把蛋刀主手和 4 个蛋刀副手,就需要修改循环主体,所以可以考虑将需要凑齐的部件作为函数的参数传入。 function raids(pa,pb,seta,setb) … end function 前面有说过,这个方法无法得到精确结果,但当模拟次数足够多时(如上文百万次),结 果和精确结果非常近似。排除代码因素造成的人为 Bug,这个方法非常可靠。所以有相当一 部分数值策划直接用这个方法计算;或是用这个方法对概率公式的计算结果进行一次验 算。 假如我们坚持要求出精确的期望次数,并且 。。。以下略