5.1.3. 生成给定分布随机数

rand_distr-badge cat-science-badge

问题:

你想从一个标量区间内取得随机数,并且需要使用指定的分布类型采样。

解决方案:

默认情况下,随机数在 rand crate 中是均匀分布。对其做补充的 rand_distr crate 提供了其它的分布类型。

如要使用,首先实例化一个分布,然后在随机数生成器 rand::Rng 的帮助下,使用 Distribution::sample 从该分布中进行采样。Distribution::sample 方法创建一个迭代器,用来生成泛型 T 的随机值,其使用 rng 作为随机来源。

如下是一个使用正态(Normal)分布的实例。

以下实例代码引用自开源书籍项目《Cookin’ with Rust》,笔者在其基础上稍作修改。

use rand_distr::{Distribution, Normal, NormalError};
use rand::thread_rng;

fn main() -> Result<(), NormalError> {
    let mut rng = thread_rng();
    let normal = Normal::new(2.0, 9.0)?; // 正态分布
    let v = normal.sample(&mut rng);

    println!("  正态分布: {}", v);

    Ok(())
}

代码第 1-5 行,分别为使用 use 将正态分布相关模块引入作用域,以及由系统创建本地线程,作用为延迟初始化的随机数生成器。

代码第 6,7 行,建立正态分布模型,以及使用通过正态分布 rand_distr::{Distribution, Normal, NormalError} trait 实现的 sample 方法从半开放范围(2.0,9.0)取随机值。

构建并运行后,结果大抵如下所示。

  正态分布: 9.911104023278147

注:你的运行结果值和笔者运行结果不一定相同。

讨论:

rand_distr crate 是 rand::distributions 模块的一个超级集合,实现了诸多概率分布类型,如均匀分布、正态分布(Normal distribution)、柯西分布(Cauchy distribution)等。

关于更多信息,可阅读相关可用分布文档