16 个版本 (9 个破坏性版本)
0.10.1 | 2024年2月24日 |
---|---|
0.10.0 | 2023年2月7日 |
0.9.0 | 2023年1月19日 |
0.8.3 | 2022年12月20日 |
0.5.1 | 2022年7月13日 |
#136 in 算法
每月下载量:1,608
用于 11 个crate(3 个直接使用)
220KB
2.5K SLoC
turborand
快速随机数生成器。
turborand
的内部实现使用了 Wyrand,一个简单快速的生成器但 不是 密码学安全的,还使用了 ChaCha8,这是一个密码学安全的生成器,针对 ChaCha 算法的 8 轮进行了优化,以显著提高吞吐量,同时不会牺牲太多安全性,正如在 Too Much Crypto 论文中提出的建议。
示例
use turborand::prelude::*;
let rand = Rng::new();
if rand.bool() {
println!("Success! :D");
} else {
println!("Failure... :(");
}
从列表中采样值
use turborand::prelude::*;
let rand = Rng::new();
let values = [1, 2, 3, 4, 5];
let value = rand.sample(&values);
生成具有随机值的向量
use turborand::prelude::*;
use std::iter::repeat_with;
let rand = Rng::new();
let values: Vec<_> = repeat_with(|| rand.f32()).take(10).collect();
无 std
兼容性
turborand
可以用于 无 std
环境,但功能和特性将有所减少。不会有 Default
实现,也没有 new()
构造函数,因此 Rng
/ChaChaRng
种子必须由用户从平台上的任何可用来源提供。除非启用 alloc
功能,否则某些 TurboRand
方法将不可用,这需要有一个全局分配器。
为 WASM 编译
为了支持 WASM 构建,您需要在您的 Cargo.toml
中添加以下内容
[target.'cfg(target_arch = "wasm32")'.dependencies]
instant = { version = "0.1", features = ["wasm-bindgen"] }
instant
需要 wasm-bindgen
或 stdweb
功能在 WASM 上激活,以便编译。然而,stdweb
已不再维护,但为了支持未来的替代方案和功能,切换 WASM 支持留给了此 crate 的用户。
性能
Wyrand
是一个相当快的 PRNG,在需要速度的同时仍具有不错的统计特性时是一个不错的选择。目前,turborand
实现与类似的 rand
算法相比表现极佳。以下是 fill_bytes
方法性能的图表,在 Windows 10 x64 上测试,AMD Ryzen 1700,主频 3.7GHz,32GB RAM,频率 3066MHz。
对于填充2048字节的数组缓冲区,turborand
的Rng
大约需要170-180纳秒来完成,而SmallRng
则需要260-268纳秒,而最快的64位系统上的PCG实现Pcg64Mcg
则需要305-312纳秒。
对于生成无界的u64
值,turborand
和fastrand
在性能上是相等的,这是预期的,因为它们都实现了Wyrand
算法,并且一致地在生成一个u64
值时执行大约820-830皮秒。SmallRng
的性能大约是1.16纳秒,而Pcg64Mcg
是1.35纳秒。
版本迁移
查看MIGRATION.md以获取迁移到turborand
主要版本所需的所有说明。
许可证
根据您的选择,许可如下
- Apache许可证版本2.0(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
。
依赖项
~0–485KB