一、伪随机数生成器(PRNG)
基于确定性的数学公式生成看似随机的数列,需要初始种子(Seed)。
1. 线性同余法(LCG)
原理:递推公式 Xₙ₊₁ = (a * Xₙ + c) mod m
a(乘数)、c(增量)、m(模数)需谨慎选择。
优点:简单高效,内存占用低。
缺点:周期较短,低位随机性较差。
参数如何确定:
线性同余生成器 - 维基百科,自由的百科全书 (wikipedia.org)
模拟实现:
1.算法类:
public class LCG
{
private float _state;
private const float A = 1664525.0f;
private const float C = 1013904223.0f;
private const float M = float.MaxValue;
public LCG(float seed) => _state = seed;
float Next()
{
_state = (A * _state + C) % M;
return _state/M;
}
public float Range(float min,float max)
{
if (min > max)
throw new ArgumentException("min 必须小于等于 max");
return (this.Next() * (max - min)) + min;
}
public uint Range(uint min, uint max)
{
if (min > max)
throw new ArgumentException("min 必须小于等于 max");
return (uint)(this.Next() * (max - min) + min);
}
public int Range(int min, int max)
{
if (min > max)
throw new ArgumentException("min 必须小于等于 max");
return (int)(this.Next() * (max - min) + min);
}
}
2.测试类:
public class RandomValueTest : MonoBehaviour
{
int MAXTIMES = 10000;
void Start()
{
this.TestLCG();
}
void TestLCG()
{
// 使用示例
var lcg = new LCG(DateTime.UtcNow.Ticks);
for (int i = 0; i < MAXTIMES; i++)
{
float randomNumber = lcg.Range(100, 200);
Debug.Log(randomNumber);
}
}
}
结果:
2. 梅森旋转算法(Mersenne Twister)
原理:基于线性反馈移位寄存器(LFSR),周期长达 2^19937-1。
优点:长周期,分布均匀,广泛使用(如Python的random模块)。
缺点