6 个版本 (稳定)
1.3.0 | 2021 年 3 月 18 日 |
---|---|
1.2.0 | 2020 年 6 月 20 日 |
1.1.0 | 2020 年 6 月 16 日 |
1.0.1 | 2020 年 6 月 15 日 |
0.0.1 | 2020 年 6 月 14 日 |
#1366 在 算法
每月下载量 7,533
在 9 个包中使用 (3 直接)
27KB
732 行
simplerand
简单快速随机数生成器
动机
我开发了一个假数据生成器,它非常依赖于随机数生成。在 Rust 世界中,提供这种功能的包是 rand 包。这是一个很酷的包,如果你需要企业级的随机生成。但是,对于简单的假数据生成器来说,它太大了。不管怎样,生成一个随机数需要 400+ 微秒。(struggle)
因此,我创建了一个基于非常简单的种子机制的简单伪随机生成器。这不能用于加密随机生成!因此,它仅适用于需要简单快速解决方案的项目,如假数据生成器。这样,我可以在 ~200 纳秒 内生成随机数。
随机数生成强烈基于 线性同余生成器,因此如果你熟悉该算法,你可以想象它有多么简单。
用法
extern crate simplerand;
use simplerand::{randn, rand_range};
fn main() {
let data = randn(10000);
println!("data: {}", data); // output: something between 0 and 10000
let data = rand_range(3000, 10000);
println!("data: {}", data); // output: something between 3000 and 10000
let generic_data = rand_range::<f32>(1000.123, 30000.123)
println!("data: {}", generic_data);
}
使用 Randomable
extern crate simplerand;
use simplerand::{Randomable, rand_range};
fn main() {
let generic_data = get_random_in_range::<u32>(10, 33);
println!("data: {}", generic_data);
}
fn get_random_in_range<T: Randomable>(min: T, max: T) -> T {
rand_range::<T>(min, max)
}
单例实现
#[macro_use]
extern crate lazy_static;
extern crate simplerand;
use std::sync::Mutex;
lazy_static! {
static ref rand: Mutex<simplerand::Rng> = Mutex::new(simplerand::Rng::new());
}
fn main() {
let number = RNG.lock().unwrap().rand_range(0, 10000); // output: something between 0 and 10000
}
rand 包
由于生成一个随机数需要 400 微秒,我认为这是因为种子机制。我想将 rand 的 ThreadRng 设置为我的声明之上的静态单例变量。我还使用了 lazy_static 来实现它,但它不是为了这个目的而设计的,因此我无法实现它。 (如果有人有解决方案,我很想看看。)
依赖项
~11KB