一、伪随机数生成器(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.cs (microsoft.com)
Random Number Generation (An Overview) (youtube.com)
MC3: Linear Congruential Random Number Generator (youtube.com)