5 个版本
0.1.4 | 2024年6月27日 |
---|---|
0.1.3 | 2024年6月25日 |
0.1.2 | 2024年6月21日 |
0.1.1 | 2024年6月21日 |
0.1.0 | 2024年6月20日 |
在 算法 中排名 773
65KB
1K SLoC
Simple Random
简单的伪随机数生成器。
简介
本项目提供了 simplerandom
,简单的伪随机数生成器。
特性
- 主要 API 函数
- 种子
- 生成“下一个”随机值
- “跳过”前 n 个样本(也称为 C++ 中的“丢弃”)。
- 简单的算法,易于移植到不同的语言。
- 安全的种子。许多生成器有一些“不良”状态值必须避免。所有生成器的种子函数确保任何“不良”状态值都被避免,并替换为合适的替代初始状态。
- 以下语言实现了这些随机数生成器
- C
- Python
- Rust
- 每个支持的语言都有相同的数值输出。在多个平台和/或语言上实现相同的算法可能很有用。
- 适用于有限 RAM 和 ROM(例如在嵌入式系统)的简单算法和状态大小。
- 良好的跨平台支持。
- 各种操作系统。
- 各种处理器,8-到 64 位。
- 实现目标语言的 API 习惯用法和/或现有的随机数生成器 API。
- 伪随机输出的合理统计特性(尽管并非所有提供的生成器都如此)。
算法
大多数算法来自 George Marsaglia 在两个新闻组帖子中的新内容 [mars1] [mars2]。然而,已经进行了一些修改。从 [rose1] 来看,[mars1] 中定义的 SHR3 算法有缺陷,不应使用。它实际上并没有预期的 232-1 周期,而是有 64 个不同的周期,其中一些非常短。2003 年帖子中的 SHR3 非常相似,但是有两个移位值被交换了。它有一个预期的 232-1 周期。
我们仍然认为来自 [mars1] 的 KISS 很有用,主要是因为它使用 32 位计算来 MWC,这可能更适合小型嵌入式系统。因此,我们定义了基于 [mars1] 的 KISS,但使用了来自 [mars2] 的 Cong 和 SHR3。
来自Pierre L'Ecuyer [lecuyer1] [lecuyer2],实现了联合LFSR(Tausworthe)LFSR113算法 [lecuyer3] 和 LFSR88(也称为Taus88)。
提供的随机数生成器
以下提供以下伪随机数生成器
生成器 | 注释 |
---|---|
MWC1 |
两个32位的MWC结合。来自 [mars1]。 |
MWC2 |
与MWC1非常相似,但略微修改以改进其统计特性。 |
Cong |
来自 [mars2]。 |
SHR3 |
来自 [mars2]。 |
MWC64 |
单个64位乘加计算。来自 [mars2]。 |
KISS |
MWC2、Cong和SHR3的组合。基于 [mars1],但使用来自 [mars2] 的Cong和SHR3以及修改后的MWC。 |
KISS2 |
MWC64、Cong和SHR3的组合。来自 [mars2]。 |
LFSR113 |
L'Ecuyer的联合LFSR(Tausworthe)随机数生成器。来自 [lecuyer1] [lecuyer3]。 |
LFSR88 |
L'Ecuyer的联合LFSR(Tausworthe)随机数生成器。来自 [lecuyer2]。 |
许可证
代码在MIT许可证下发布。有关详细信息,请参阅LICENSE.txt。
参考文献
[mars1]
C语言的随机数:终于结束了?
George Marsaglia
新组帖子,sci.stat.math和其他,星期四,1999年1月21日
[mars2]
RNGs
George Marsaglia
新组帖子,sci.math,2003年2月26日
[rose1]
KISS:太简单了
Greg Rose
高通公司
[lecuyer1]
最大均匀分布联合LFSR生成器的表
Pierre L'Ecuyer
计算数学,68,225(1999),261–269。
[lecuyer2]
最大均匀分布联合Tausworthe生成器
P. L'Ecuyer
计算数学,65,213(1996),203–213。
[lecuyer3]
LFSR113 C双实现
Pierre L'Ecuyer
依赖项
~200KB