编者注:此代码示例来自1.0之前的Rust版本,并且在语法上不是有效的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)>());
}
如何在给定范围内(例如:0到n)使用Rust生成“简单”随机数(例如:i64
)?
答案 0 :(得分:24)
使用Rng::gen_range
生成0到100之间的随机数:
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);
}
不要忘记将rand
依赖项添加到Cargo.toml:
[dependencies]
rand = "0.6.5"
答案 1 :(得分:15)
编者注:这个答案适用于1.0之前的Rust版本,在Rust 1.0中无效。
最近这种情况发生了很大变化(对不起!这一切都是我),在Rust 0.8中它被称为gen_integer_range
(注意URL中的/0.8/
而不是/master/
,如果您使用的是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);
}
答案 2 :(得分:6)
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);
}