46

编者注:此代码示例来自 Rust 1.0 之前的版本,在语法上不是有效的 Rust 1.0 代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。

我遇到了以下如何使用 Rust 生成随机数的示例,但它似乎不起作用。该示例没有显示它适用于哪个版本的 Rust,所以它可能已经过时,或者我有什么问题。

// http://static.rust-lang.org/doc/master/std/rand/trait.Rng.html

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

fn main() {
    let mut rng = rand::task_rng();
    let n: uint = rng.gen_range(0u, 10);
    println!("{}", n);
    let m: float = rng.gen_range(-40.0, 1.3e5);
    println!("{}", m);
}

当我尝试编译它时,会出现以下错误:

test_rand002.rs:6:17: 6:39 error: type `@mut std::rand::IsaacRng` does not
implement any method in scope named `gen_range`
test_rand002.rs:6    let n: uint = rng.gen_range(0u, 10);
                                   ^~~~~~~~~~~~~~~~~~~~~~
test_rand002.rs:8:18: 8:46 error: type `@mut std::rand::IsaacRng` does not
implement any method in scope named `gen_range`
test_rand002.rs:8    let m: float = rng.gen_range(-40.0, 1.3e5);
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

在同一页面(上图)上还有另一个示例(如下)确实有效。但是,尽管我可以调整它,但它并不能完全满足我的要求。

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

fn main() {
    let mut rng = rand::task_rng();
    let x: uint = rng.gen();
    println!("{}", x);
    println!("{:?}", rng.gen::<(f64, bool)>());
}

如何i64在给定范围(例如:0 到 n)内使用 Rust(例如:)生成“简单”随机数?

4

3 回答 3

65

这会生成一个介于 0(包括)和 100(不包括)之间的随机数Rng::gen_range

use rand::Rng; // 0.8.0

fn main() {
    // Generate random number in the range [0, 99]
    let num = rand::thread_rng().gen_range(0..100);
    println!("{}", num);
}

不要忘记将rand依赖项添加到 Cargo.toml:

[dependencies]
rand = "0.8"
于 2016-05-04T01:41:02.937 回答
23

编者注:此答案适用于 Rust 1.0 之前的版本,在 Rust 1.0 中无效。请参阅Manoel Stilpen 的答案

这最近发生了很大变化(对不起!都是我),在 Rust 0.8 中它被称为gen_integer_range(注意/0.8/而不是/master/在 URL 中,如果你使用的是 0.8,你需要阅读那些文档)。

一个警告:.gen_integer_range在许多方面完全不正确,新的.gen_range没有不正确的问题。


主代码(.gen_range工作正常):

use std::rand::{task_rng, Rng};

fn main() {
    // a number from [-40.0, 13000.0)
    let num: f64 = task_rng().gen_range(-40.0, 1.3e4);
    println!("{}", num);
}
于 2013-10-30T06:04:09.750 回答
10

状态的文档Rng::gen_range

此功能针对仅从给定范围中提取单个样本的情况进行了优化。另请参阅Uniform如果重复从同一范围采样可能更快的分布类型。

Uniform可用于生成单个值:

use rand::distributions::{Distribution, Uniform}; // 0.6.5

fn main() {
    let step = Uniform::new(0, 50);
    let mut rng = rand::thread_rng();
    let choice = step.sample(&mut rng);
    println!("{}", choice);
}

操场

或者生成值的迭代器:

use rand::distributions::{Distribution, Uniform}; // 0.6.5

fn main() {
    let step = Uniform::new(0, 50);
    let mut rng = rand::thread_rng();
    let choices: Vec<_> = step.sample_iter(&mut rng).take(10).collect();
    println!("{:?}", choices);
}

操场

于 2016-08-30T17:29:15.893 回答