近来在游戏中涉及到了一些需要使用随机算法的逻辑,这里简单记录下使用到的算法以便以后翻阅
随机概率分布算法
概率分布算法在游戏中可以用在,计算游戏命中、闪避、暴击机率设定对应的分布机率来随机当次攻击属于的类型,上边的思路有点像 圆桌算法
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
function randomProbability(rate:number[],totalRate:number=100) {
let random =Math.random()
let random_number = Math.floor(random * (totalRate- 1) + 1)
let start = 0;
let index = 0;
for (let i = 0; i < rate.length; i++) {
start += rate[i]
if (random_number <= start) {
index = i;
break
}
}
return index;
}
//概率的分布数组
let rate:number[] = [30,20,50]
let res_num = 0
for(let i=0;i<1000;i++)
{
let result = randomAction(rate);
if(result==0)
{
res_num+=1;
}
}
console.log("res number:",res_num)
|
随机种子数算法
由于TS或JS中没有种子函数,但 Math.random
的随机数又不能满足需求,只有使用如下的随机算法了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//随机种子数
static seed: number = 100
/**
* 根据设定的随机种子数,返回参数设定范围内的随机值
* @params max:number 最大值
* @params min:number 最小值
* @return number
**/
public static seededRandom(
max?: number,
min?: number
) {
max = max || 1;
min = min || 0;
seed = (GameUtils.seed * 9301 + 49297) % 233280;
var rnd = seed / 233280.0;
return (min + rnd * (max - min));
}
|
除了这个方法外还有一种就是使用 Math.sin(seed)
来产生随机数;