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 在 算法
61 每月下载量
29KB
450 行
TinyMT
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实现提供支持,适用于std
和no_std
环境。
- TinyMT32(32位版本)用于
u32
和f32
。它也被IEFT定义为RFC 8682。 - TinyMT64(64位版本)用于
u64
和f64
。
TinyMT32也已被用于生成随机数,以控制宝可梦中的哪些怪物将孵化。
请注意,TinyMT和MT 19937都不是加密安全的伪随机数生成器。你不应该在需要高安全性的应用程序中使用它们,例如生成私钥。
入门指南
您可以通过将依赖项添加到项目的Cargo.toml
文件中来使用TinyMT。
[dependencies]
rand = "0.8"
tinymt = "1.0"
通过在源代码开头声明tinymt
crate,您可以使用TinyMT64
或TinyMT32
来获取随机数。
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
。您应该使用 u32
或 f32
随机数以在 TinyMT32
中实现最佳性能。
底层 API
此包包含两个模块 tinymt::tinymt64
和 tinymt::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