前言 本人能力有限,所以所讲解的例子全部为trigger,并不涉及JASS编写 一.理论
首先,魔兽内的随机数为伪随机。不要被字面上迷惑了,就像JASS为解释性语言,不是基础性语言,可是我们还是可是使用JASS编写函数。所以,伪随机还是随机,只不过我们无法改变其中本质。
那么伪随机是个什么存在呢?使用WE测试过随机数的朋友们都知道要先关闭WE参数里的固定随机种子,即SEED。这就是这里的关键,随机种子是和随机数列联系在一起的。假如我们不选中固定随机种子,每次加载地图的时候都会随机一个数值做为随机种子。那么实际当中用到这个随机种子的时候它还是固定的,所以称这个由随机种子为参量的随机为”伪随机“。
综上所述我们就可以得出结论:随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。 这个结论可以根据固定随机种子显示随机数的方法得到验证。
下面给出zhuzhu写的一个固定随机种子产生随机数的函数
[jass]
globals
integer seed=224//这是固定了的随机种子数值,对于32位数字,这已经够大了~!
endglobals
//下面是和标准WE一样的线性同余算法(目前主流伪随机算法)
function GetRandomInt takes integer bot,integer top returns integer
set seed=(seed*1103515245)+12345
set seed=seed/65536
set seed=seed-seed/(top-bot+1)+bot
return seed
endfunction
[/jass]
那么我们实际中用到的是什么呢?不是随机种子也不是上面的算法,而是这个伪随机产生的随机数序列。这个数列的大小和我们在触发里设置的随机数最小值和最大值有关。
现在忘掉上面的理论,我们来说些实际点的东西。
二.运用
首先我们要明确一个概念,随机就像现实生活中的偶然事件,突发事件,应该是不可预知的,而计算机是无法做出偶然事件的。我们这里讲的随机数实际上是由周期性函数得出的,只是把周期性函数的系数调整后,得出的周期非常大,模拟得出偶然结果。所以我们讨论的重点应该放在怎样得出更像随机结果的相对必然结果上。
1.trigger中随机数运用
[trigger]
随机数
事件
时间 - 每 1.00 秒触发事件
条件
动作
设置 N = (随机整数,最小值:1 最大值:10)
[/trigger]
这样的触发对随机要求一般的朋友已经可以满足了。理论上这个触发里1—10之间每个数出现的概率为10%,可能是由于数序比较小的原因,我们实际游戏当中会发现个别数字出现的几率貌似高一些,有一种分布不均的感觉。
2.随机数取模
[trigger]
随机数取模
事件
时间 - 每 1.00 秒触发事件
条件
动作
设置 N = ((随机整数,最小值:1 最大值:100)mod 10)
[/trigger]
取得随机数后取模,一定程度上能够解决随机数分布不均的情况。
我们先讲解一下mod,mod称为模运算,其实就是数学中常用的取余运算。下面给大家回顾一下小学数学知识,我们用例子来说明。
10%3=3......1 10=3×3+1
8%4=2........0 转换为逆运算 8=4×2+0
15%4=3......3 15=4×3+3
实际上取模和取余的运算时一样的,于是我们给出取模运算的定义:x对y取模等于 x 减去 y 乘上 x与y的商的下界,公式为 x mod y=x-y×(x/y) 。
注意事项:
1.在取模操作中,左操作数应该大于右操作数,否则取模结果为左操作数。
2.在取模操作中,余数的正负符号完全取决于左操作数,和左操作数的正负号一致。
3.小数取余,用左边的操作数连续减去右边的操作数,直到结果小于右边的操作数,此结果为余。即对商截去小数位后的运算。
3.多次使用随机数
实际应用中,往往需要一些特殊的随机数,我们可以多次使用随机数来得出最终的随机数。
方法有很多种,有利有弊,大家看一下做到心中有数,合适自己的才是最好的。
例1:
[trigger]
随机数取随机数
事件
时间 - 每 1.00 秒触发事件
条件
动作
设置 X = (随机整数,最小值:1 最大值:10)
设置 Y = (随机整数,最小值:90 最大值:100)
设置 N = (随机整数,最小值:X 最大值:Y)
[/trigger]
这里的随机有明显的分布不均,1~10与90~100之间数字出现的概率相对较低,11~89之间的数字出现概率相对高。
不过用来做攻击力倒很合适,1~10为失误,90~100为暴击,11~89为正常攻击力范围。
例2:
[trigger]
条件判断取随机数
事件
时间 - 每 1.00 秒触发事件
条件
动作
设置 X = (英雄 的力量值(不包括 加成))
如果多有条件成立则做动作1,否则做动作2
If - 条件
X 大于或等于 20
Then - 动作
设置 N= (随机整数,最小值:5 最大值:10)
Else - 动作
设置 N= (随机整数,最小值:1 最大值:5)
[/trigger]
这个是把英雄的属性改为幸运值的一种做法,根据不断改变的英雄属性使得幸运点数在稳步提升后依然随机。这里用的条件判断有很大的发展空间,可以使用AND或OR把多个判断条件联系在一起。
例3:
[trigger]
随机数做概率
事件1
地图初始化
条件
动作
设置 wupinp[0]=猪头
设置 wupinp[1]=猪头
设置 wupinp[2]=猪头
设置 wupinp[3]=猪头
设置 wupinp[4]=猪头
--------这里的wupin[]变量为物品类型数组--------
[/trigger]
[trigger]
随机数做概率
事件2
单位 - 任意单位 死亡
条件
((死亡单位)的类型) 等于 猪
(随机整数,最小值:1 最大值:100)小于或等于 5
动作
设置 N =(随机整数,最小值:0 最大值:4)
--------上面的最小最大值对应物品类型数组索引的最小最大值--------
物品 - 创建 wupin[N] 在((死亡单位)的位置)
[/trigger]
这是很经典用随机数做杀怪掉宝概率的例子。这里指定了死亡单位的类型,要想做全局的,只要把这句条件删了就可以了。百分率的具体数值只要改变小于或等于后的数值。
嗯嗯。。。应该有些收获吧!全文到这里就结束了! |