web-dev-qa-db-ja.com

Rustの範囲内で乱数を生成するにはどうすればよいですか?

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

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

22
Brian Oh

編集者注:この回答はRust 1.0より前のバージョンのものであり、Rust 1.0では無効です。

これは最近大きく変わりました(すみません!それはすべて私です)。そしてRust 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);
}
18
huon

Rng::gen_range を使用して、0〜100の乱数を生成します。

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

Cargo.tomlにRand依存関係を追加することを忘れないでください:

[dependencies]
Rand = "0.6.5"
30
Manoel Stilpen

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

遊び場

8
andy boot