当前位置: 首页 > backend >正文

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

一、伪随机数生成器(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)

http://www.xdnf.cn/news/1292.html

相关文章:

  • QtCreator 调试 Linux 内核详细步骤指南
  • 多轮Function Calling的最佳实践
  • 解决找不到字体的问题
  • org.springframework.beans.factory.config.YamlPropertiesFactoryBean 类详解
  • Java函数生成实际应用案例:数据处理流水线
  • 代理设计模式:从底层原理到源代码 详解
  • RT-Thread学习笔记(三)
  • 从零开始学java--二叉树和哈希表
  • 工作中sql总结
  • 无需复杂操作即可锁定键鼠的工具
  • [大模型]什么是function calling?
  • Linux操作系统--进程程序替换and做一个简单的shell
  • 3.6/Q1,Charls数据库经典文章解读
  • 【第九章 Python学习之函数Ⅱ】
  • 监控页面卡顿PerformanceObserver
  • idea快捷键 Project tool window
  • MySQL 性能监控工具的多维度对比分析
  • 出现了锁等待或死锁现象怎么办?乐观锁?分布式锁了解一下?
  • C语言教程(十三):C 语言中 enum(枚举)的详细介绍
  • C++ 学习指南
  • 一款强大的实时协作Markdown工具 | CodiMD 9.6K ⭐
  • 携程-酒旅-数据研发面经【附答案】
  • 【Spring】单例作用域下多次访问同一个接口
  • Discuz!+DeepSeek:传统论坛的智能化蜕变之路
  • 【C++】新手入门指南(下)
  • 《Linux TCP通信深度解析:实现高可靠工业数据传输客户端》
  • 使用Python设置excel单元格的字体(font值)
  • 笔记本电脑研发笔记:BIOS,Driver,Preloader详记
  • Win10一体机(MES电脑设置上电自动开机)
  • 《Android系统应用部署暗礁:OAT文件缺失引发的连锁崩溃与防御体系构建》