簡體   English   中英

如何在 Rust 的范圍內生成隨機數?

[英]How can I generate a random number within a range in Rust?

編者注:此代碼示例來自 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)>());
}

如何在給定范圍(例如:0 到 n)內使用 Rust (例如: i64 )生成“簡單”隨機數?

這會使用Rng::gen_range生成一個介於 0(包含)和 100(不包含)之間的隨機數:

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"

編者注:此答案適用於 1.0 之前的 Rust 版本,在 Rust 1.0 中無效。 請參閱Manoel Stilpen 的回答

這最近發生了很大變化(對不起!都是我),在 Rust 0.8 中它被稱為gen_integer_range (注意 URL 中的/0.8/而不是/master/ ,如果你使用 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的文檔指出:

此功能針對僅從給定范圍制作單個樣本的情況進行了優化。 另請參閱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);
}

游樂場

為什么不直接使用模數?

let x = rng.gen<u32>() % 25

因此您的值將介於 0 和 24 之間。如果您需要不同的范圍,請添加偏移量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM