5.1.3. 生成给定分布随机数
问题:
你想从一个标量区间内取得随机数,并且需要使用指定的分布类型采样。
解决方案:
默认情况下,随机数在 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)等。
关于更多信息,可阅读相关可用分布文档。