首页 > 解决方案 > 如何在不引入偏差的情况下生成一个范围内的随机 Rust 整数?

问题描述

我如何在 Rust 中生成随机骰子?

我知道我可以使用rand::random,但这需要我想生成一个整数类型的值。使用rand::random<u8>() % 6引入了偏差。

标签: randomrust

解决方案


用于Rng::gen_range一次性值:

use rand::{self, Rng}; // 0.8.0

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

    let die = rng.gen_range(1..=6);

    println!("The die was: {}", die);
}

在引擎盖下,这创建了一个Uniform结构。如果您将获得多个随机数,请自行创建此结构:

use rand::{
    self,
    distributions::{Distribution, Uniform},
}; // 0.8.0

fn main() {
    let mut rng = rand::thread_rng();
    let die_range = Uniform::new_inclusive(1, 6);

    let die = die_range.sample(&mut rng);

    println!("{}", die);
}

Uniform做一些预计算来弄清楚如何在不引入偏差的情况下将随机值的完整范围映射到您想要的范围。它转换并调整原始范围的大小以最接近随机数生成器的范围,丢弃任何超出此新范围的随机数,然后调整大小并转换回原始范围。

也可以看看:


推荐阅读