忘记自己 发表于 2008-5-2 20:06:45

理论派→第二谈★随机值★

前面的帖子里既然讨论到随机值问题
我就把着文章贴过来吧

                                                魔兽攻击力随机值分析
大家都知道,war3里面攻击力是有范围的,DH的闪避、BM的暴击等都是有概率的。所以在war3里,随时随地都是有随机事件发生的。但大家可能没注意过,攻击力的随机值是怎样产生的呢?是全范围内的等概率事件,还是如二项式曲线一样中间概率高、两边概率低?

  正确的答案是:中间的数值概率高,两边的概率低。至于具体的分布概率,请看下面详解。

  大家应该都看过魔兽的中文帮助,细心的朋友可能发现了,有些版本的帮助中,对攻击力的数值的表述不是一个由下限到上限的具体数字范围,而是用的类似这样一个式子:
  A+BdC(其中ABC均为自然数)
  比如0攻rm吧,用前一种表述方法就是18-24,而用后一种表述方法则为:16+2d4。有人可能会问了,这种表述方法是什么意思呢?

  这其实表示,war3中攻击力的概率分布使用的是d&d色子系统。通俗一点的理解就是:任何兵种都是有一个基础攻击力数值A(比如rm就是16),B则代表色子数量(比如rm就是2),C则代表色子的面数(比如rm就是4,这里不一定是6啊,war3不是搓麻)。rm每攻击一次,系统就扔出两个4面的色子(色子扔出1-4的概率是相同的),假如扔出来的数值是2、4,那么这一次攻击的数值就是16+2+4=22。当然啦,当扔出的都是1时,就是最小值18,当都是4时,就是最大值24。

  现在来研究一下攻击力分布概率的问题。继续拿0攻的rm举例,其他的兵种道理是一样的。
  18(24):一种可能性1/101+1(4+4)
  19(23):两种可能性2/101+2、2+1(3+4、4+3)
  20(22):三种可能性3/101+3、2+2、3+1(2+4、3+3、4+2)
  21:四种可能性4/101+4、2+3、3+2、4+1
  可以看出来,越居中的数值随机出来的可能性越高,而两边的数值概率是对称的,越远概率越低。也许可能有人要问了,那rm18-24的攻击力为什么不能表示为17+1d7或者15+3d3呢?这两个式子也代表了18-24这个攻击范围啊?这是一个好问题,如果各位war3er看到这里能提出这个问题的话,说明你是个善于动脑、善于思考的人。

  答案是这样的,大家想一下,war3对攻击力的升级是怎么实现的呢?很简单,就是加一个色子。再拿rm举例,1攻的rm攻击力是19-28,用先前的表示法就是16+3d4。而如果是17+1d7或者15+3d3的话升一攻加一个色子后变成17+2d7或者15+4d3,这分别对应于19-31、19-27,这与事实是不符的。同理,2攻3攻的rm的攻击力分别为16+4d4(20-32)、16+5d4(21-36)。

  现在大家再看一下这个式子:A+BdC,升1、2、3级攻后B分别为B+1、B+2、B+3。
可以看出,A越大、B越小、C越大,那么升级攻后对攻击力的提升更加显著。下面列表看一下各族各个兵种的攻击力数值(召唤生物、法师没有列出,因为他们不能升级攻防,于本文没有讨论意义):

HUM:      ORC:      NE:      UD:   
民兵:11+1d2  大G:17+1d4  ac:15+1d3   小g:10+2d2
fm:11+1d2   猎头:22+1d5  ht:15+1d3    zz:25+1d6
rm:16+2d4  粉碎者:71+1d18 投刃车:35+1d18  天g:17+1d4
74:25+2d5  狼骑:22+1d5  小鹿:16+1d3   骷髅:13+1d2
破法:12+1d3  飞龙:34+2d5  doc:18+1d4   绞肉车:70+1d18
飞机:6+1d2  蝙蝠:12+1d3  熊形态:26+3d6   abo:32+1d7
  13+1d2   牛头:29+1d7  角鹰:49+1d8   des:18+1d3
小炮:51+1d13          角鹰骑:15+1d3  冰龙:91+2d12
坦克:44+1d11          精灵龙:13+1d3
  12+1d2           奇美拉:66+1d17
49:44+1d11               44+1d11
61:17+1d3           山岭:26+2d7
                   32+2d8
                 dot鸟:34+1d7

  可以看出,初级兵里zz的A、C值最高,而49、奇美拉、小炮、三种CAT都符合A大、B小、C大的原则,也就是说,对于他们升攻对攻击力的提高是显著的。还有一个不得不提的就是熊,它是唯一B值为3的,而C值也只有6,升攻对它并不显著,只是因为B值较大,攻击力范围很大而已。而C值小于4的(比如des、61),升攻对它们是没什么太大作用的。还有要强调的一点就是:对于B=1的兵种来说,升攻前因为只有一颗色子,所以它们的攻击力概率分布是均匀的,当B〉1后就符合前文所说的中间概率高,两边概率低的规律了。

  
  我们都知道,rep记录的是时间序列,即什么时间什么坐标的单位,以什么样的命令,指向目标坐标;而对于这个动作所造成的结果,是在播放rep时实时演算的。比如,坐标(1,1)的fm,以动作指令“A”,指向坐标(3,3)的DH;而对于这次攻击实际造成的伤害,rep里是不会、也没有必要、甚至是不能记录的。于是问题就产生了,由于随机系统的存在,每一次动作指令造成的结果是不定的,fm可能给dh造成8点伤害,也可能被dh闪避掉,怎么才能保证播放rep时真实的重现当时的情况呢?

  一种解释是:对于每一个动作,rep都记录下对应于它的随机数。但这显然是不合理的,因为其数据量过于庞大了,要知道一次攻击通常都会产生不止一个随机数。

  学过basic的可能都知道,对于随机函数randonmize如果不指定随机种子的话,其产生的随机数列是不会改变的,也就是说不同的随机种子对应于不同的随机数列。依据这个原理,我认为是这样的,一次游戏开始前,war3先随机产生一个随机种子,而这个种子和随机数列之间是唯一对应的,当一个随机事件产生的时候,系统就按照先后顺序分配事前已产生好的随机数。rep也只须记录这个随机种子,当播放rep的时候,系统根据记录的随机种子重新产生出这个随机数列,由于时间顺序是确定的,所以一个随机事件对应的随机数也是确定的,这样就可以真实的重现当时的情况,而且也可以大大的缩小数据量。


以上观点证实了魔兽连机机制   
我想补充的是所谓的随机其实也是按特定的算法进行的
而且几率是固定的    随机种子导致的运算结果   就是二项式曲线
出现爆机   就是在曲线交际的时候
因为基数大小   所以几率并不是相同也是必然相同的

忘记自己 发表于 2008-5-2 20:16:26

很明显。。又是有人看没人回。。
贴子。。即将沉↓

anyifeng 发表于 2008-5-2 20:25:04

很明显。。。长篇大论真的是没人赏脸。。。。

zj54891 发表于 2008-5-2 20:39:43

攻击实际造成的伤害是不能记录的
有根据吗

http://rs.phpwind.net/E___5200ZHALPWFG.gif

忘记自己 发表于 2008-5-2 20:48:11

建议你去看本人的前面一篇
联机机制
魔兽能记录和传递的东西   只有操作
操作相符合
就会有修改   
实际伤害关联到很多因素   
有时 会有延迟所以 算持续性的比较好(不是每秒伤害的那种)
所以没有所谓的实际攻击
既然没有怎么记录?

白银の式神 发表于 2008-5-2 20:57:16

所有内核支持replay的游戏都是记录seed的...

春の莓果 发表于 2008-5-2 21:04:33

引用第5楼白银の式神于2008-05-02 20:57发表的:
所有内核支持replay的游戏都是记录seed的...

忘记自己 发表于 2008-5-2 21:17:37

5楼明显比我了解核心引擎。。。

腋来香 发表于 2008-5-3 00:59:09

你才知道啊

sroun 发表于 2008-5-3 01:03:58

此文非常眼熟。。。难道在RN看到过?

鸡斯拉 发表于 2008-5-3 01:12:23

楼主发这个东西之前有人讨论过了

这也还罢了
楼主居然用那么长的文字来吓人

这也还罢了
楼主的排版让人望而生畏

这也还罢了
先说内容再说总结 对用户的友好度太低 应该反过来

这也还罢了
转帖的帖子 不应该指望啥

hyp 发表于 2008-5-3 08:49:24

没啥可看性 没看出有什么新东西在里面
期待楼主下一篇理论

551155 发表于 2008-5-3 10:17:31

楼主不过是转了个帖子然后写上自己的看法,而且前在注明转帖,只不过不知道引用功能~某楼不要无意识的批判~

腋来香 发表于 2008-5-3 10:33:43

顺便发现个很烂的结论-骰子面小升级攻击力就不显著……

忘记自己 发表于 2008-5-3 19:34:18

其实骰子面的设定   就是对应了内码中的某算法
只不过不是表上看的那么简单......

凸一_一凸 发表于 2008-6-12 14:09:15

先问一下,能否实现真正的随机值呢?

这个对我的图来说,很重要

忘记自己 发表于 2008-6-12 14:47:46

额。。。。。。这算挖坟么。。。。。。

只要做了算法那么就是随机的
那么 我们写的随机值 为伪随机
内部算法为真随机
真正的随机发生率=伪随机+真随机(并不是加法)
内部算法看成定值    伪随机看为变值
那么最后的结果就是变值
所以随机还是随机,只不过实际上是固定发生率的
计算机内没有随机数 这么一说的
不过魔兽里我们不考虑这些    我们也不能改变这些

Gallium 发表于 2008-6-12 14:50:17

不算挖坟吧??KOOK的规定是2个月吧?

我想知道微软的随机函数是怎么做的……~~

谁能说下?

忘记自己 发表于 2008-6-12 14:51:52

微软的随机函数?具体点。。。。

Gallium 发表于 2008-6-12 14:58:21

额 就用C#的Random函数来说吧 记得是实现0.00~1.00的实数随机数吧?

那微软实现这个随机函数的计算公式是什么?
页: [1] 2
查看完整版本: 理论派→第二谈★随机值★