2013-10-30 107 views
7

當使用Rust搜索如何生成一個隨機數時,我遇到了下面的例子。然而,它似乎沒有工作......這個例子似乎沒有顯示它適用於哪個版本的Rust,所以它可能已經過時,或者我可能出錯了。如何在Rust的範圍內生成一個隨機數?

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

01 use std::rand; 
02 use std::rand::Rng; 
03 
04 fn main() { 
05 let mut rng = rand::task_rng(); 
06 let n: uint = rng.gen_range(0u, 10); 
07 println!("{}", n); 
08 let m: float = rng.gen_range(-40.0, 1.3e5); 
09 println!("{}", m); 
10 } 

當我嘗試編譯這個,結果如下:

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); 
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
error: aborting due to 2 previous errors 

還有一個好例子(如下圖)同一頁面(如上圖),做工作的。但是,它並不是我想要的,儘管我可以適應它。

其他示例(其作品):

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)?

+0

鏈接http://static.rust-lang.org/doc/master/意味着版本是高手。 –

+0

快速注意到下面的答案似乎都不適用於Rust 1.7。 – frabcus

回答

10

這是最近改變了很多(對不起!這一切都被我的),並在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); 
} 
+0

太好了。我喜歡改進 - 特別是在1.0之前。 –

+0

分號丟失和1.3e5是130 000 – rofrol

+0

我看到0.10和主文檔說'使用rand :: Rng' http://static.rust-lang.org/doc/0.10/rand/index.html 所以這是一個文檔錯誤可能 – rofrol

11

爲我工作是這樣的:

extern crate rand; 
use rand::Rng; 
fn main(){ 
    let num = rand::thread_rng().gen_range(0, 100); 
    println!("{}", num); 
} 

它會產生0到100

之間的隨機數

不要忘記將蘭德依賴添加到cargo.toml

編輯:產生的隨機數是在區間[0,99]

+1

(''] 0..100 ['')或包含邊界(''[0..100]'')? – BitTickler

+1

@BitTickler它會在間隔內產生一個數字[0,99] –

3

現在鏽穩定可以像這樣生成的隨機數: (工程與板條箱:蘭特= 0.3和RAND = 0.4)

extern crate rand; 
use rand::distributions::{IndependentSample, Range}; 

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

Live example和 鏈接Docs

+0

在Rust 1.15.1中,我得到了'rand :: thread_rng'的「unresolved name」。 https://play.rust-lang.org/?gist=dfb901354368c0fb14bd82bda2435f95&version=stable&backtrace=0 – sudo

+0

因爲每個答案甚至文檔都使用'rand :: thread_rng',所以我認爲有所改變。順便說一句,'rand'現在不穩定,所以你必須在文件的頂部添加'#![feature(rand)]'並使用每晚的rustc。我想要做的就是測試一些東西;我* *這*接近於通過FFI使用C'rand()'函數並調用它一天。 – sudo

+0

這適用於Rust 1.7.0。不過,必須在'Cargo.toml'文件中添加'rand =「0.3」''。 – frabcus

相關問題