46

編集者注: このコード例は、Rust 1.0 より前のバージョンのものであり、構文的に有効な 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)>());
}

i64Rust (例: ) を使用して特定の範囲 (例: 0 から n) 内で「単純な」乱数を生成するにはどうすればよいですか?

4

3 に答える 3

65

これは、以下を使用して 0 (含む) から 100 (含まない) の間の乱数を生成しRng::gen_rangeます。

use rand::Rng; // 0.8.0

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.8"
于 2016-05-04T01:41:02.937 に答える
10

状態のドキュメント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);
}

遊び場

于 2016-08-30T17:29:15.893 に答える