#generator #numbers #language #cross-platform #ported

bin+lib simplerandom

简单的伪随机数生成器

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

MIT 许可协议

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