随机值

我们已经有办法生成随机数据,但如何把数据转化成我们想要的类型的值呢?

这是一个难题:我们既需要知道 范围 ,又需要知道这个值的 分布 。 对于分布,将在 下一章 介绍。

Rng trait

方便起见,所有的 RNG 自动实现了 Rng trait ,从而方便地生成随机值。 以下是方便生成均匀分布随机值的一些函数(方法):

  • Rng::gen 从类型合适的范围内生成无偏均匀分布的随机值。 对于整数,通常在整个范围内产生值(比如从 0u32std::u32::MAX 生成 u32 类型的值); 对于浮点数,从 0-1 内产生值;也支持一些其他类型,比如数组和元组。

    这个方法能很方便地生成 Standard 分布(译者注:这不是正态分布/标准正态分布, 而是 Rand 库自定义的一种拓展形式上的“均匀分布”) ,这在 下一章 会介绍。

  • Rng::gen_range 在给定的范围内生成无偏随机值。

  • Rng::fillRng::try_fill 是经过优化的函数,用来给字节或者整数切片填充随机值。

以下方法能方便生成非均匀分布的 bool 值:

最后,这个函数能从任意分布中抽样产生随机值:

例子:

#![allow(unused)]
fn main() {
extern crate rand;
use rand::Rng;
let mut rng = rand::thread_rng();

// an unbiased integer over the entire range:
let i: i32 = rng.gen();

// a uniformly distributed value between 0 and 1:
let x: f64 = rng.gen();

// simulate rolling a die:
let roll = rng.gen_range(1..7);
}

此外, random 函数基于 thread_rng 来调用 Rng::gen ,是产生随机值的捷径。

#![allow(unused)]
fn main() {
if rand::random() {
    println!("we got lucky!");
}
}