web-dev-qa-db-fra.com

Comment puis-je générer un nombre aléatoire dans une plage dans Rust?

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

22
Brian Oh

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);
}
18
huon

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"
30
Manoel Stilpen

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

Aire de jeux

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

Aire de jeux

8
andy boot