2013-10-30 12 views
7

Durante la ricerca di come generare un numero casuale usando Rust, mi sono imbattuto nel seguente esempio. Tuttavia, non sembra funzionare ... l'esempio non sembra mostrare a quale versione di Rust si applica, quindi forse non è aggiornato, o forse ho sbagliato qualcosa.Come posso generare un numero casuale all'interno di un intervallo in 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 } 

Quando si tenta di compilare questo, i seguenti risultati:

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 

V'è un altro esempio (come segue) sulla stessa pagina (sopra) che fa il lavoro. Tuttavia, non fa esattamente quello che voglio, anche se potrei adattarlo.

altro esempio (che funziona):

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)>()); 
} 

Come posso generare un numero casuale "semplice" utilizzando Rust (ad es: I64) entro un determinato intervallo (ad esempio: da 0 a n)?

+0

collegamento ai http://static.rust-lang.org/doc/master/ significare la versione è maestro. –

+0

Una breve nota che nessuna delle risposte seguenti sembra funzionare per Rust 1.7. – frabcus

risposta

10

Questo sta cambiando molto recente (scusate! È tutto stato io), in 0.8 è stato chiamato gen_integer_range (notare il /0.8/ piuttosto che /master/ nella URL, se si utilizza 0,8 si necessità di leggere quei documenti).

Una parola di avviso: .gen_integer_range era completamente errata in molti modi, il nuovo .gen_range non ha problemi di correttezza.


Codice in materia di master (dove .gen_range funziona bene):

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

Grande. Mi piacciono i miglioramenti, in particolare prima della 1.0. –

+0

punto e virgola mancante e 1.3e5 è 130 000 – rofrol

+0

Vedo che per 0.10 e master la documentazione dice di usare rand :: Rng' http://static.rust-lang.org/doc/0.10/rand/index.html quindi è un errore di documentazione probabilmente – rofrol

11

Ha lavorato per me in questo modo:

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

Si genera un numero casuale compreso tra 0 e 100.

Non dimenticare di aggiungere le dipendenze di RAND a cargo.toml

Edit: il numero casuale generato è nell'intervallo [0,99]

+1

Tra (''] 0..100 ['') o compresi i limiti ('' [0..100] '')? – BitTickler

+1

@BitTickler genera un numero nell'intervallo [0,99] –

3

Ora ruggine è stabile un numero casuale possono essere generati in questo modo: (lavori con una gabbia: rand = 0.3 e 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 e link per Docs

+0

In Rust 1.15.1, sto ricevendo "nome non risolto" da 'rand :: thread_rng'. https://play.rust-lang.org/?gist=dfb901354368c0fb14bd82bda2435f95&version=stable&backtrace=0 – sudo

+0

Penso che qualcosa sia cambiato da ogni risposta e anche la documentazione usa 'rand :: thread_rng'. A proposito, 'rand' ora è instabile, quindi devi aggiungere' #! [Feature (rand)] 'all'inizio del tuo file e usare il nightly rustc. Tutto quello che voglio fare è testare qualcosa; Sono * questo * vicino a usare semplicemente la funzione C 'rand()' attraverso FFI e chiamandolo un giorno. – sudo

+0

Questo funziona per me con Rust 1.7.0. Bisogna aggiungere 'rand =" 0.3 "' nel file 'Cargo.toml'. – frabcus

Problemi correlati