如何在Rust中生成一个范围内的随机数?

Bri*_* Oh 18 random rust rust-obsolete

在搜索如何使用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);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,会产生以下结果:

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);
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

在同一页面(上面)上有另一个例子(如下所示)可以工作.然而,它并没有完全符合我的要求,尽管我可以适应它.

其他例子(有效):

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)>());
}
Run Code Online (Sandbox Code Playgroud)

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

Man*_*pen 27

以这种方式为我工作:

extern crate rand; // 0.6.5

use rand::Rng;

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

它会生成0到100之间的随机数.

别忘了将rand依赖项添加到cargo.toml

编辑:生成的随机数在区间[0,99]内

  • 这甚至不会编译编译器说没有方法 gen_rng rand::prelude::ThreadRng (5认同)
  • @nikoss 您需要安装 rand crate。正如我所说,将它添加到cargo.toml (2认同)

huo*_*uon 16

This has been changing a lot recently (sorry! it's all been me), and in 0.8 it was called gen_integer_range (note the /0.8/ rather than /master/ in the URL, if you are using 0.8 you need to be reading those docs).

A word of warning: .gen_integer_range was entirely incorrect in many ways, the new .gen_range doesn't have incorrectness problems.


Code for master (where .gen_range works fine):

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些偶然发现这个问题的人来说:"rand"似乎已经成为一个独立的箱子了,Manoel Stilpen在下面你明确使用那个箱子的答案是有效的. (8认同)
  • 我得到`rust.rs:1:17:1:25错误:未解决导入`std :: rand :: task_rng`.`std :: rand`中没有`task_rng`,rust.rs:1使用std :: rand :: {task_rng,Rng}; ^ ~~~~~~~错误:由于之前的错误而中止`当我尝试用`rustc 1.0.0-nightly编译它时(b4c965ee8 2015-03-02)(建于2015-03-03) (2认同)

and*_*oot 6

现在生锈是稳定的,可以像这样生成一个随机数:(使用箱子:rand = 0.3和rand = 0.4)

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);
}
Run Code Online (Sandbox Code Playgroud)

实例文档链接