代码之家  ›  专栏  ›  技术社区  ›  Chris Jefferson

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

  •  1
  • Chris Jefferson  · 技术社区  · 6 年前

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

    2 回复  |  直到 6 年前
        1
  •  6
  •   Shepmaster Tim Diekmann    4 年前

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

    制服

    另请参见:

        2
  •  3
  •   lynks    6 年前

    你是对的,偏见被引入;当你想从集合A映射到集合B,其中集合B的基数不是集合A的因子或倍数时,你就会有偏差。

    42*6=252 . 所以你可以扔掉任何东西 u8 值为252或更大(并再次调用random)。

    然后可以使用模运算符安全地映射输出。最后加1达到标准[1,6]骰子输出。

    编辑:看起来兰德板条箱考虑了一些偏差: https://docs.rs/rand/latest/rand/distributions/uniform/struct.Uniform.html