什么时候rng.gen()不是真的?

时间:2014-06-11 01:25:30

标签: rust

我使用std:rand中的数字生成器作为通用随机数生成器的模板。问题有时候,函数无声地失败,所以我添加了一个只打印“Not true!”的失败子句。

use std::rand;
use std::rand::Rng;

fn main() {
    let mut rng = rand::task_rng();
    if rng.gen() { // bool
        println!("f64: {}", rng.gen::<f64>());
    } else {
        println!("Not true!");
    }
}

有时运行可执行文件会打印一个随机数,有时会打印“Not true!”。什么可能导致rng.gen()评估为false?

编辑:语法

2 个答案:

答案 0 :(得分:2)

来自documentation of the Rng::gen方法:

// Return a random value of a Rand type.
fn gen<T: Rand>(&mut self) -> T

T类型为bool时,它会随机生成truefalse。如果它始终生成true值,那么它就不会有用。

通常,if rng.gen() { ... } else { ... }是一个有用的习惯用语,&#34;随机选择两个代码路径中的一个。&#34;

答案 1 :(得分:2)

让我们来看一下签名。

fn gen<T: Rand>(&mut self) -> T

Rand? “可以使用Rng随机生成的类型。”,包括其实现者bool

简单来说,gen()可以根据它可以推断的类型返回实现Rand的任何类型的值。你可以得到一个随机数,一个随机字符,甚至是一个随机的字符。

if子句必须是bool类型。因此,类型推断器确定该特定T调用的gen()bool。您也可以将rng.gen::<bool>()写成同样的效果。

因此,将评估if / else结构的哪个分支是随机的。