如何生成范围内的随机数向量?

问题描述 投票:1回答:2

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

vector random rust
2个回答
7
投票

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

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

拆分:

  1. 0..100创建一个0到99的迭代器
  2. 处理迭代器时,.map处理迭代器中的每个项。
  3. .collect()使用迭代器并将其转换为任何实现FromIterator的类型,在您的情况下是Vec

对此随机值进行扩展,您可以调整.map函数,使用rand crate的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);
}

(Qazxswpoi)

您还应该考虑使用On the Playground类型预先创建范围,这比多次调用rand::distributions::Uniform更有效,然后从中提取样本100次:

gen_range

(Qazxswpoi)


6
投票

TL; DR:

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);
}

使用On the Playground而不是简单地执行均匀随机数的模数是很重要的。有关详细信息,请参阅use rand::{distributions::Uniform, Rng}; // 0.6.5 fn main() { let range = Uniform::from(0..20); let values: Vec<u64> = rand::thread_rng().sample_iter(&range).take(100).collect(); println!("{:?}", values); }

由于我们从一个范围生成多个数字,因此创建rand::distributions::uniform::Uniform并重复使用它会更高效。创建Why do people say there is modulo bias when using a random number generator?会进行一些计算以避免采样偏差。

我们可以使用Uniform创建一个随机值的迭代器,然后Uniform中的一些数量,收集到Rng::sample_itertake甚至会使用Vec来准确分配正确数量的元素。


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

Iterator::size_hint
© www.soinside.com 2019 - 2024. All rights reserved.