随机数
随机数
在逻辑中有这样一个函数返回一个伪随机数
rnd(float min,float max) float
不过该函数存在相同帧生成相同的问题,本章将详细讲解如何避免它。
为了避免它,你可能使用些时钟等方式来生成随机数,不过这些方案往往不够随机。
这里以1.15反编译代码作为讲解。
在rnd方法中有一个RandomIndex和bE值,bE与抛射体渲染有关,RandomIndex在解析单个ini文件时与每个rnd函数绑定且不同,以0开始自增的。
这导致多个单位的rnd的RandomIndex相同,而生成相同的随机数。
它调用了一个类似这样的方法
float a((int)min*1000,(int)max*1000,RandomIndex+unit.bE)/1000
你可以通过发射抛射体影响bE的值来改变引索,不过这对于多个单位作用不大。
这是反编译代码。
public static final int a(int i, int i2, int i3) {
k t = k.t();
if (i < i2) {
int i4 = i2 - i;
int i5 = (((t.bu % 10) + (1313131313 * t.bu)) + (((t.bG + ((133333333 * i3) * i4)) + (i3 * 13131313)) + ((t.bu * 13131313) * i3))) % i4;
if (i5 < 0) {
i5 = -i5;
}
i5 += i;
if (i5 < i || i5 > i2) {
k.b("notRandInt number not in range: " + i5 + " min:" + i + " max:" + i2);
}
return i5;
} else if (i <= i2) {
return i;
} else {
k.b("min>max");
return i;
}
}
其中tu是游戏帧,bG是动态变化的种子。
由此可见改变i4也就是最大与最小值的差,来影响随机生成结果的开销最小。
这里可以使用self.id作为偏移。
rnd(self.id*0.001,1/0)
由于float数精度损失,这个随机生成器的有效范围是16777215,考虑到游戏滥用id,该id是可能被突破的。
这时应该使用rnd组件。