随机号传染媒介在范围的

mrs*_*eve 1 random vector rust

如何生成100个64位整数值的向量,范围从1到20,允许重复?

log*_*yth 7

这里有一些主要的部分.首先,如何创建100个计算项目的向量?最简单的方法是创建100的范围并映射这些项目.例如,您可以这样做:

let vals: Vec<u64> = (0..100).map(|v| v + 1000).collect();
// [1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, ...
Run Code Online (Sandbox Code Playgroud)

拆分:

  1. 0..100 创建一个0到99的迭代器
  2. .map 处理迭代器时处理迭代器中的每个项.
  3. .collect()接受一个迭代器并将其转换为任何实现FromIterator哪种类型的类型Vec.

因此,对于随机值进行扩展,可以.map使用randcrate gen_range函数调整函数以生成0到20之间的随机值,以在给定范围内创建数值.

use rand::Rng; // 0.6.5

fn main() {
    let mut rng = rand::thread_rng();

    let vals: Vec<u64> = (0..100).map(|_| rng.gen_range(0, 20)).collect();

    println!("{:?}", vals);
}
Run Code Online (Sandbox Code Playgroud)

(在游乐场)

您还可以考虑使用该rand::distributions::Uniform类型预先创建范围,然后从中提取样本100次:

use rand::{distributions::Uniform, Rng}; // 0.6.5

fn main() {
    let mut rng = rand::thread_rng();
    let range = Uniform::new(0, 20);

    let vals: Vec<u64> = (0..100).map(|_| rng.sample(&range)).collect();

    println!("{:?}", vals);
}
Run Code Online (Sandbox Code Playgroud)

(在游乐场)


She*_*ter 7

TL; DR:

use rand::{distributions::Uniform, Rng}; // 0.7.0

fn main() {
    let range = Uniform::from(0..20);
    let values: Vec<u64> = rand::thread_rng().sample_iter(&range).take(100).collect();
    println!("{:?}", values);
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用rand::distributions::uniform::Uniform配对,Uniform因为它在语义上更接近我设想的问题:

使用Uniform而不是简单地执行均匀随机数的模数也很重要.请参阅为什么人们说使用随机数生成器时存在模偏差?更多细节.

由于我们从一个范围生成多个数字,因此创建Rng::sample_iter一次并重复使用它会更高效.创建take一些计算以避免采样偏差.

如果您只需要该范围内的单个随机数,则可以使用快捷方式Vec:

use rand::Rng; // 0.7.0

fn main() {
    let mut rng = rand::thread_rng();
    let value: u64 = rng.gen_range(0, 20);
}
Run Code Online (Sandbox Code Playgroud)

  • `accept_zone`计算是你应该分配[`Range`](https://doc.rust-lang.org/rand/rand/distributions/range/struct.Range.html)一次并重复使用它的原因在循环中调用[`gen_range`](https://doc.rust-lang.org/rand/rand/trait.Rng.html#method.gen_range). (2认同)