一、伪随机数生成器(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模块)。
缺点:内存占用较高,不适合加密场景。
3. Xorshift算法
原理:通过异或和位移操作快速生成随机数。
优点:速度快,周期长(但短于梅森旋转)。
拓展:
Xorshift - 维基百科,自由的百科全书 (wikipedia.org)
4. PCG算法(Permuted Congruential Generator)
原理:结合LCG和置换函数,提升随机性。
优点:统计性能优秀,周期长,内存效率高。
二、真随机数生成器(TRNG)
依赖物理现象(如热噪声、辐射衰变)生成非确定性随机数。
三、C#中的随机数源码
四、Unity中的随机数
unity中的Random.Range中的浮点数随机数是1000万个随机样本出现一次。
未完待续。。。
参考链接:
Random Number Generation (An Overview) (youtube.com)
MC3: Linear Congruential Random Number Generator (youtube.com)