如何在不引入偏差的情况下生成一个范围内的随机 Rust 整数?

Chr*_*son 3 random rust

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

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

She*_*ter 6

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

Run Code Online (Sandbox Code Playgroud)

在幕后,这会创建一个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);
}
Run Code Online (Sandbox Code Playgroud)

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

也可以看看: