#numbers #mersenne-twister #mt #variant #state #generator #period

tinymt

Rust实现的TinyMT 64/32 - Mersenne Twister PRNG的一个轻量级变体

8个稳定版本

1.0.9 2023年6月29日
1.0.8 2023年3月15日
1.0.7 2022年5月19日
1.0.6 2021年6月12日
1.0.4 2020年2月12日

#482算法

Download history 7/week @ 2024-03-13 3/week @ 2024-03-27 10/week @ 2024-04-03 102/week @ 2024-04-10 1/week @ 2024-04-24

61 每月下载量

MIT 协议

29KB
450

TinyMT

Release Build Status for Linux Test Status docs crates.io

TinyMT 64/32的Rust实现 - Mersenne Twister PRNG的一个轻量级变体。

此crate基于C语言实现的原始TinyMT 1.1.1 @ 9d7ca3c161。

特性

TinyMT是广泛使用的PRNG(伪随机数生成器)Mersenne Twister MT19937的一个轻量级变体。当不需要MT19937那样的长周期,但需要足够的随机性和速度,并且内存占用更少时,这很有用。

此算法仅使用16B内部状态空间,远小于MT19937的2,500B。周期为2¹²⁷-1,虽然比MT19937短,但对于实际应用来说是足够的。在Intel Core i7-8550U CPU上生成一个随机数的成本仅为4ns。

此crate为两个TinyMT实现提供支持,适用于stdno_std环境。

  • TinyMT32(32位版本)用于u32f32。它也被IEFT定义为RFC 8682
  • TinyMT64(64位版本)用于u64f64

TinyMT32也已被用于生成随机数,以控制宝可梦中的哪些怪物将孵化。

请注意,TinyMT和MT 19937都不是加密安全的伪随机数生成器。你不应该在需要高安全性的应用程序中使用它们,例如生成私钥。

入门指南

您可以通过将依赖项添加到项目的Cargo.toml文件中来使用TinyMT。

[dependencies]
rand = "0.8"
tinymt = "1.0"

通过在源代码开头声明tinymt crate,您可以使用TinyMT64TinyMT32来获取随机数。

extern crate tinymt;

use rand::{Rng, SeedableRng};
use tinymt::{TinyMT64, TinyMT64Seed};

fn main() {
  // from nondeterministic seed
  let mut random = TinyMT64::from_entropy();
  let rn = random.gen_range(0.0..1.0);
  println!("{}", rn);   // => nondeterministic but such that 0.3487526381670172

  // from deterministic seed (reproduction of random number sequence is possible)
  let mut random = TinyMT64::from_seed(TinyMT64Seed::from(0u64));
  let rn = random.gen_range(0.0..1.0);
  println!("{}", rn);   // => 0.5531250908497853
}

《TinyMT64》和《TinyMT32》分别实现了 Rust 中广泛使用的 PRNG 接口 rand::RngCore。请注意,TinyMT32 的 64 位操作将一次生成 32 位随机数两次,以兼容 RngCore。您应该使用 u32f32 随机数以在 TinyMT32 中实现最佳性能。

底层 API

此包包含两个模块 tinymt::tinymt64tinymt::tinymt32,它们已从原始 C 实现迁移而来。如果您熟悉原始 C 实现,它们可能很有用。此外,由于它们独立于外部库,因此可以避免一些冲突问题。

查看API 参考以获取所有函数的详细信息。

如何构建

以下是在测试和验证 TinyMT 质量时使用的典型 cargo 命令。

cargo test
cargo clippy
cargo fmt       # or fmt -- --check

WebAssembly 支持

在针对 WebAssembly (WASM) 的 Rust 代码中,TinyMT 完全可用。如果您的环境中设置了 wasmer,则可以运行 cargo test --target wasm32-wasi。有关详细信息,请参阅.cargo/config

如果您的目标不支持 WASI,例如 wasm32-unknown-unknown,则基于熵的从操作系统加载种子将不会自动支持。在这种情况下,您可以使用 TinyMT,方法是使用没有使用 from_entropy() 的应用程序定义的种子,或者如果目标支持 JS(如浏览器),则使 getrandom() 依赖于 JS,如下所示。

[dependencies]
getrandom = { version = "0.2", features = ["js"] }

有关更多信息,请参阅getrandom 的描述

历史记录

  • 2023-06-30 (v1.0.9) 添加了对 WebAssembly 的支持。
  • 2023-03-15 (v1.0.8) 提供 no-std
  • 2022-05-19 (v1.0.7) 将项目迁移到 2021 版本。
  • 2021-06-12 (v1.0.6) 将 rand 升级到 0.8。

许可证

MIT 许可证

版权所有 (c) 2023 Torao Takami

以下是对任何获得此软件和相关文档副本(“软件”)的人的授权,免费使用软件,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向软件提供的人以这种方式行事,但受以下条件约束

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者都不对任何索赔、损害或其他责任负责,无论源于合同、侵权或其他方式,以及与软件或其使用或其它交易有关。

另请参阅

依赖项

~310KB