29 个版本 (15 个稳定版)
2.0.1 | 2023年12月20日 |
---|---|
1.1.5 | 2023年11月8日 |
1.1.4 | 2023年10月20日 |
1.1.0 | 2023年3月5日 |
0.3.0 | 2022年2月23日 |
#600 在 测试 类别中
每月 944 次下载
被 11 个 crates (4 直接) 使用
22KB
298 行
Ran
作者:Libor Spacek
描述
此 crate 的目标是快速、简单、占用最小空间地生成高质量的随机数。它完全使用 Rust 安全编写,轻量且无任何依赖。
提供多种生成算法,以及一系列实用的函数。它们可以轻松生成各种支持的类型、向量以及填充随机数的向量。还可以指定要生成的值的范围。
主要目标是易用性,但算法也非常快。它们主要是现代 XOR 和 shift 类型,即使用这两个低级指令。在文本中给出了参考。
强烈建议阅读 tests/tests.rs
中的使用示例。可以通过点击此文档顶部的 'test' 徽章查看最新的自动化测试日志。(徽章也作为链接)。
入门
这些算法使用线程安全的静态种子,在编译时自动初始化为 systime
秒。如果使用此crate的程序每秒重新编译超过 6.3376E+56
年,它将每次生成一个新的唯一随机序列。这意味着序列在实用上是不可预测的。警告:这不是在密码学意义上的。
为了在每次运行时强制不可预测的序列,请使用 set_seeds(0);
。这对于现实主义的模拟很有用。种子将被设置为 systime
纳秒。然后,相同的序列有时可能会重复,概率低至 2E-64
。
为了生成可重复的随机序列,必须使用 set_seeds(value);
初始化种子到一个已知值。每个 u64 值将生成它自己的唯一随机序列。这对于精确比较很有用,例如,在完全相同的随机数据上测试的不同算法。可以使用 get_seed()
获取并保存当前种子值,然后在任何后来的时间重新创建相同的序列。
函数名称语法
名称 ::= ran{维度}_类型
维度 ::= v|vv
类型 ::= u8|u16|u64|i64|f64|u64_range|i64_range|f64_range
生成支持类型的单个随机数
示例
fn ran() {
println!("ran_u8: {}",ran_u8());
println!("ran_u16: {}",ran_u16());
println!("ran_u64: {}",ran_u64());
println!("ran_i64: {}",ran_i64());
println!("ran_f64: {}",ran_f64());
println!("ran_u64_range: {}",ran_u64_range(1..=6));
println!("ran_i64_range: {}",ran_i64_range(-6..=6));
println!("ran_f64_range: {}",ran_f64_range(-100.0..=100.0));
}
生成支持类型的随机数向量
示例
fn ranv()-> Result<(),Re> {
println!("ranv_u8: {}",stringv(&ranv_u8(5)?));
println!("ranv_u16: {}",stringv(&ranv_u16(5)?));
println!("ranv_u64: {}",stringv(&ranv_u64(5)?));
println!("ranv_i64: {}",stringv(&ranv_i64(5)?));
println!("ranv_f64: {}",stringv(&ranv_f64(5)?));
println!("ranv_u64_range: {}",stringv(&ranv_u64_range(5,1..=6)?));
println!("ranv_i64_range: {}",stringv(&ranv_i64_range(5,-6..=6)?));
println!("ranv_f64_range: {}",stringv(&ranv_f64_range(5,-100_f64..=100_f64)?));
Ok(())
}
说明
- 这些函数检查它们的参数,并可能返回错误。
stringv
是一个将泛型向量 '转换为字符串' 的实用函数,用于显示。
生成随机数矩阵
示例
fn ranvv()-> Result<(),Re> {
set_seeds(0);
println!("ranvv_u8: {}",stringvv(&ranvv_u8(2,5)?));
println!("ranvv_u16: {}",stringvv(&ranvv_u16(2,5)?));
println!("ranvv_u64: {}",stringvv(&ranvv_u64(2,5)?));
println!("ranvv_i64: {}",stringvv(&ranvv_i64(2,5)?));
println!("ranvv_f64: {}",stringvv(&ranvv_f64(2,5)?));
println!("ranvv_u64_range: {}",stringvv(&ranvv_u64_range(2,5,1..=6)?));
println!("ranvv_i64_range: {}",stringvv(&ranvv_i64_range(2,5,-6..=6)?));
println!("ranvv_f64_range: {}",stringvv(&ranvv_f64_range(2,5,-100_f64..=100_f64)?));
Ok(())
}
说明
- 这些函数检查它们的参数,并可能返回错误。
stringvv
是一个将泛型向量矩阵 '转换为字符串' 的实用函数,用于显示。
最新版本(按时间顺序排列)
版本 2.0.1 修正了 ranvv_f64_range
中交换的参数 d,n。
版本 2.0.0 删除了从用户角度看不必要的枚举泛型。
版本 1.1.5 一些小的注释和测试改进。
版本 1.1.4 在 1.1.3
中删除的 get_seed()
已恢复。它对于保存 SEED 的状态以在以后重新生成相同的序列很有用。
版本 1.1.3 由于 Rust 1.73.0 的支持,进行了一些代码简化。还将 rerror
实用函数更改为返回 Result
。
版本 1.1.2 种子在编译时初始化。这意味着相同的可执行文件将始终产生相同的序列。为了完全不可预测,可以新使用 set_seeds(0)
。
版本 1.1.1 现在种子自动初始化为 systime
秒,因此序列是不可预测的。当需要相同的序列时,手动将种子初始化为先前使用的值。
版本 1.1.0 更好的错误处理。将别名类型 RanError<String>
重命名为 Re
。引入了函数 rerror
。