我已经看到这个问题了很多但从未见过真正的具体答案.所以我将在这里发布一个,希望能帮助人们理解为什么在使用随机数生成器时会出现"模数偏差",就像rand()在C++中一样.
有没有办法在 Rust 中保存通用随机数生成器?我想要一种编写通用代码的方法,例如:
use rand::Rng; // 0.7.2
fn main() {
// Purely random numbers on the interval 0 to 1
println!("Pure random");
let mut rng: Box<dyn rand::Rng> = Box::new(rand::thread_rng());
for i in 0..10 {
println!("{}", rng.gen::<f64>());
}
println!("");
// On a seed
*rng = rand::SeedableRng::seed_from_u64(0);
for i in 0..10 {
println!("{}", rng.gen::<f64>());
}
println!("");
}
Run Code Online (Sandbox Code Playgroud)
该变量rng使用种子或其他方式保存不同类型的随机数生成器。然而,这段代码存在很多错误,例如:
use rand::Rng; // 0.7.2
fn main() {
// Purely random numbers on the interval 0 to 1
println!("Pure random");
let mut rng: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用一个矢量初始化后填充一个矢量,with_capacity()因为在创建矢量之前已知元素的数量,并且使用它似乎更有效。
以下代码不会使用随机值AT ALL填充:println!("{}", v.len());输出零。
use rand::Rng;
fn main() {
const NUMBER_OF_RANDOM_NUMBERS: usize = 10;
let mut v = Vec::with_capacity(NUMBER_OF_RANDOM_NUMBERS);
for i in &mut v {
*i += rand::thread_rng().gen_range(1, 2^32);
}
println!("{}", v.len());
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,在let mut v = Vec::with_capacity(NUMBER_OF_RANDOM_NUMBERS)使用10个零初始化一个崭新的向量之后,然后使用rand::thread_rng().gen_range(1, 2^32)插入,或者我应该说,向每个零添加一个随机数。
我在这里想念什么吗?