随机数算法原理以及模拟实现

一、伪随机数生成器(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模块)。
​​缺点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值