編集者注:このコード例は、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)?
編集者注:この回答は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);
}
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"
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);
}