Note de l'éditeur: cet exemple de code provient d'une version de Rust antérieure à 1.0 et n'est pas syntaxiquement valide Rust 1.0 code. Les versions mises à jour de ce code produisent des erreurs différentes , mais les réponses contiennent toujours des informations précieuses.
Je suis tombé sur l'exemple suivant de la façon de générer un nombre aléatoire à l'aide de Rust, mais cela ne semble pas fonctionner. L'exemple ne montre pas à quelle version de Rust il s'applique, alors peut-être qu'il est obsolète, ou peut-être que j'ai quelque chose de mal.
// 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);
}
Lorsque j'essaie de compiler cela, les résultats d'erreur suivants:
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);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Il y a un autre exemple (comme suit) sur la même page (ci-dessus) qui fonctionne. Cependant, il ne fait pas exactement ce que je veux, bien que je puisse l'adapter.
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)>());
}
Comment puis-je générer un nombre aléatoire "simple" en utilisant Rust (par exemple: i64
) dans une plage donnée (par exemple: 0 à n)?
Note de l'éditeur: cette réponse concerne une version de Rust antérieure à 1.0 et n'est pas valide dans Rust 1.0.
Cela a beaucoup changé récemment (désolé! C'est tout moi), et en Rust 0.8 on l'appelait gen_integer_range
(notez le /0.8/
plutôt que /master/
dans l'URL, si vous utilisez 0.8, vous avez besoin de lire ces documents).
Un mot d'avertissement: .gen_integer_range
était totalement incorrect à bien des égards, le nouveau .gen_range
n'a pas de problèmes d'inexactitude.
Code du maître (où .gen_range
fonctionne bien):
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);
}
Cela génère un nombre aléatoire entre 0 et 100 en utilisant Rng::gen_range
:
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);
}
N'oubliez pas d'ajouter la dépendance Rand
à Cargo.toml:
[dependencies]
Rand = "0.6.5"
La documentation pour Rng::gen_range
indique:
Cette fonction est optimisée dans le cas où un seul échantillon est fabriqué à partir de la plage donnée. Voir aussi le type de distribution
Uniform
qui peut être plus rapide si l'échantillonnage de la même plage à plusieurs reprises.
Uniform
peut être utilisé pour générer une seule valeur:
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);
}
Ou pour générer un itérateur de valeurs:
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);
}