发信人: seaeye()
整理人: yufif(2002-12-13 09:32:15), 站内信件
|
第三章 前两章的深入学习和实践
这一章,主要是深入说明前两章的概念,以及使用Excel做实验和统计
实践性很强,读者如果光看不练那么是学不到什么的.
本章重点:掌握如何统计分析两种武器的优劣.
题外话:前两章的发表,不少朋友啧啧赞好,也有一些朋友提出异议
这里作点解释.
数学一直被很多人误解为理论太强,实践性太低,不愿学好.
其实数学是所有自然科学中实践性最强的,很多人没有学好,不会运用
就认为数学实践性低,这个......不对吧?
实际上我在学校时也没有认真学概率,是打Diablo2X时才对概率产生兴趣的
我觉得既然可以花100小时杀怪物,何不花1-2小时上BBS学学别人的打法,
花1-2小时看看D2X资料,花1-2小时查查英文,花1-2小时学学概率.
以上四项,认为它们没用的人都不少,
我的意见是:以上几项都有用,不过是有人不肯,不会去运用而已.
3-1: 计算机的随机行为
第一章我们提到 概率就是大量随机事件的规律
随机事件就是发生前无法确定结果的事件.
那么问题来了,计算机大家都知道是严格执行固定指令的机器
根本不可能有随机的行为.
那么游戏的随机数是如何产生的呢?
答: 计算机通过数学递推公式产生"伪装的随机数".
由于计算机没有随机行为,所以到目前为止,
光靠计算机产生完全随机的数字被认为是不可能的.
现在很多随机软件,实际上是通过递推公式计算随机数的
只要知道前几个数和公式,就可以计算出无数的"伪随机数"
"伪随机数"的出现是完全可预料的,所以不是真正的随机.
但是,设计良好的随机程序,可以符合随机数的统计结果
看上去和实际使用都跟真正的随机数差不多(要求极为严格的应用除外)
出于成本问题,人们就广泛使用方便的计算公式了.
一般来说,我们可以在游戏里面综合使用以下数据作为随机计算的原始数据
以便得到更随机的"伪随机数".
以毫秒计算的时间; 鼠标的移动; 键盘的击键; 事件发生时的地图坐标;
捡起物品的顺序,人物的跑动......
为方便起见,以下讨论均把伪随机数等同于随机数
3-2: 使用Excel生成随机数. (请打开Excel,边看边做)
好多朋友会觉得统计D2X游戏的事件太麻烦,甚至是不可能的
幸好,虽然D2X没有提高如同游戏<<永远的伊苏>>一样好的统计数据.
但我们可以用其它能产生随机数的软件(最常见的要算Excel了)进行实验,分析.
首先,安装Ms-Office,选择安装Excel.(废话!)
然后运行Excel,你将会看到一个布满矩形格的画面,每个矩形格称为单元格.
每个单元格有唯一的表示,如A列第一行的单元格表示为A1,第二行的表示为A2
左键点击单元格,然后可以输入数字,文本等等.试试看......
在单元格输入任何东西之前,如果先打"="号,则Excel把随后的输入视为计算公式
试试以下输入
=1+1 (单元格显示2)
=10*10 (显示100,Excel用"*"号表示乘法,"/"号表示除法)
=20/5 (显示4)
=1+1*2 (显示3)
......多试试不同的公式,看看帮助.
对其它单元格的结果进行计算:
在A1单元格输入1,B1单元格输入2,然后在C1单元格输入"=A1+B1"(双引号不必输入)
在D1单元格输入"=B1*C1"
我们可以看到C1的显示是3.D1的显示是6
在A1输入其它的值,观察C1,D1单元格的值的改变.
我们可以使用Excel计算复杂的数学公式,以及通过在公式中引用其它单元格
把复杂的计算分为几步进行,便于阅读和查错.
以下举游戏的实例了.
显示某武器的攻击伤害是10-20,那么用Excel模拟攻击10次,并计算总伤害.
其实在这个简单的例子,我们可以知道武器平均伤害是15,10次攻击大概有150点伤害
那么现在看看模拟结果.
首先我们必须使用Excel的随机函数,产生10-20之间的随机数
这个函数名称为Randbetween,默认是没有安装的.
所以我们需要在工具--加载宏--然后在分析工具库处打勾,按确定退出.
然后在A1输入公式"=Randbetween(10,20)"
现在应该可以看到A1出现了一个10-20的数值.
然后点击随便一个单元格,按一下"Delete"键,观察A1的改变
(按"Delete"键可以使Excel重新生成随机数
如果发现Excel没有重新计算,那么在"工具"--"选项"--"重新计算"--选择自动重算)
我们可以看到每次按"Delete"键,A1的值都会随机地改变,
而且经常出现10,20等极端的数字.平均数15反倒很少见.
这说明概率用于预测一个事件的结果,是很不准确的
接下来
我们点击A1,Ctrl+C复制A1的公式
然后用鼠标或键盘选择(HighLight)A2-A10的单元格
鼠标可以左键点击A2,按住不放,向下拉到A10,然后松开.
键盘可以选择A2,然后按住Shift+下方向箭头,移到A10以后松开.
选择了A2-A10以后,我们可以按Ctrl+V(粘贴),把A1的公式粘贴到A2-A10
我们可以看到A1-A10单元格都有一个随机的数值了.
这时,在B1处输入"=Sum(A1:A10)" (从A1加到A10)
我们可以看到B1处显示了A1-A10单元格的数值的和.
同样地,点击随便一个单元格,按一下"Delete"键,观察A1-A10,B1的改变
我们可以看到每次按"Delete"键,所有单元格的值都会随机地改变,
不过B1很少出现100,200等极端的数字.
多数的结果都在平均数150左右.
这说明用于实验的随机事件越多,结果越接近概率预测的数值.
同样地,再试试把随机数公式复制到A1-A100,A1-A1000,A1-A10000等单元格
(使用Shift+PageDown组合键可以很快地选中大量单元格)
改变B1的公式的范围=Sum(A1:A100),=Sum(A1:A1000),=Sum(A1:A10000)
观察结果与平均数的偏差.
理解概率为什么要大量随机事件,才能准确.
现在我们可以模拟任意武器在一万次攻击内造成的伤害了!
3-3: 大家简单练习好了,我们就开始更复杂的比较
模拟两件武器的伤害谁高!
武器A: 15-30物理伤害,+1-50点电伤害.
武器B: 21-42物理伤害,没有其它属性.
Diablo2中,物理攻击的伤害公式是:
投射类武器和手持攻击类武器
武器基本伤害为 W,
加点数的装备为 +xx Damage,
加百分比的技能和为 + yy% Damage
则公式为
Str
总伤害 = (W + xx) * ( 1 + ----- + yy% ) + 元素类攻击的伤害
100
弓箭类武器则将上式的Str换为Dex
也就是说,弓箭类武器的伤害跟力量毫无关系,
投射类和手持攻击类的武器伤害跟Dex无关.
另外提一下刺客的爪系掌握和虎击视同装备的+ yy%方式计算
假设现在没有+ xx Damage,和+ yy%的装备和技能,
Str是100,使用手持攻击武器,那么:
Str
总伤害 = 基本伤害 * ( 1 + ----- ) + 元素类攻击的伤害
100
化简为:
总伤害 = 基本伤害 * 2 + 元素类攻击的伤害
那么武器A的模拟可以这样做:
A1输入=randbetween(15,30) * 2,得到物理攻击部分的随机伤害
B1输入=randbetween(1,50),得到电攻击部分的随机伤害.
C1输入=A1+B1,得到随机的总伤害.
把以上公式复制到A1-A1000,B1-B1000,C1-C1000
D1输入=Sum(C1:C1000)
这样就得到模拟武器A攻击1000次的总伤害.
武器B的模拟可以这样做:
E1输入=randbetween(21,42) * 2,得到物理攻击部分的随机伤害
把以上公式复制到E1-E1000,
F1输入=Sum(E1:E1000)
这样就得到模拟武器B攻击1000次的总伤害.
G1输入=D1/F1,得到两个总伤害的比值,
右击G1,选择"设置单元格格式"--"百分比",
可以直观地看到武器A的伤害比B多12%左右.
比较一下D1和F1,在空白单元格多按几次"Delete"键
就知道哪个武器的伤害高了!
注意,由于随机数是有一定偏差幅度的,所以如果时而D1高,时而F1高,
那么这两个武器可以认为是差不多
需要更精确的结果,可以试试模拟10000次攻击,不过运算速度可能会很慢
大家看着办吧.
练习题
在上面的例子,我们没有考虑命中率的影响,
现在,补充假设命中率是72%,
请模拟计算以上武器谁比谁好,好多少?
提示:使用Excel的If函数判断是否命中,
如果命中,伤害不变,如果不中,伤害为零.
If函数的格式为 if(条件判断,判断为正确的取值,判断为错误的取值)
如考虑武器A在72%的命中率是否命中,把结果放在E1
需要在单元格E1输入 =if(RandBetween(1,100)<72,D1,0)
以上公式意思为:
RandBetween(1,100)<72,(命中率72%的模拟)
=if(...,D1,0) (如果命中,伤害值=D1,如果不命中,取零)
而总伤害要改为=SUM(E1:E1000).
依此类推......
答案见下文
答案:还是武器A比武器B好,还是好12%左右
并且可以看出,引入命中率以后,结果的偏差幅度更大了
而在模拟2000次,或更多的攻击次数时,结果的偏差幅度会减少.
本章总结: 终于可以利用Excel,验证武器的好坏了
不过本章动手的地方很多,光看不练是完全看不下去的. |
|