Rust 隨機數
· 3 分鐘閱讀
這篇備忘錄記錄了如何在 Rust 中生成隨機數。
資訊
Rust 的標準庫不直接包含生成隨機數的功能,而是通過 rand crate 提供。rand 是一個強大且靈活的庫,支持多種隨機數生成器和分佈。
1. 添加 rand 依賴
首先,你需要將 rand crate 添加到你的 Cargo.toml 文件中:
[dependencies]
rand = "0.8" # 使用 0.8.x 系列的最新版本
2. 生成隨機整數
使用 rand::Rng trait 來生成隨機數。最簡單的方法是使用 rand::thread_rng() 獲取一個線程局部隨機數生成器。
use rand::Rng; // 導入 Rng trait
fn main() {
let mut rng = rand::thread_rng(); // 獲取線程局部隨機數生成器
// 生成一個範圍在 [1, 10) 之間的隨機整數 (不包含 10)
let random_int = rng.gen_range(1..10);
println!("隨機整數 (1-9): {}", random_int);
// 生成一個範圍在 [1, 10] 之間的隨機整數 (包含 10)
let random_int_inclusive = rng.gen_range(1..=10);
println!("隨機整數 (1-10): {}", random_int_inclusive);
// 生成一個布爾值
let random_bool = rng.gen_bool(0.5); // 0.5 的概率為 true
println!("隨機布爾值: {}", random_bool);
}
3. 生成隨機浮點數
gen_range 也可以用於浮點數。
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
// 生成一個範圍在 [0.0, 1.0) 之間的隨機浮點數 (不包含 1.0)
let random_float = rng.gen_range(0.0..1.0);
println!("隨機浮點數 (0.0-1.0): {}", random_float);
// 生成一個範圍在 [10.0, 20.0) 之間的隨機浮點數
let random_float_custom = rng.gen_range(10.0..20.0);
println!("隨機浮點數 (10.0-20.0): {}", random_float_custom);
}
4. 從列表中隨機選擇
你可以使用 rand::seq::SliceRandom trait 來從切片(如向量或數組)中隨機選擇元素或打亂順序。
use rand::seq::SliceRandom;
use rand::Rng;
fn main() {
let mut rng = rand::thread_rng();
let choices = ["蘋果", "香蕉", "櫻桃", "日期"];
// 隨機選擇一個元素
let random_choice = choices.choose(&mut rng);
println!("隨機選擇: {:?}", random_choice.unwrap());
// 隨機選擇多個元素 (可能重複)
let mut selected_multiple: Vec<&str> = (0..2)
.map(|_| choices.choose(&mut rng).unwrap())
.collect();
println!("隨機選擇多個: {:?}", selected_multiple);
// 隨機打亂向量的順序
let mut numbers = vec![1, 2, 3, 4, 5];
numbers.shuffle(&mut rng);
println!("打亂後的數字: {:?}", numbers);
}
5. 自定義隨機數生成器 (PRNG)
如果你需要可重複的隨機數序列,或者需要不同的隨機數生成器,你可以使用 rand crate 提供的各種 PRNG。例如,StdRng 是一個確定性隨機數生成器。
[dependencies]
rand = { version = "0.8", features = ["std"] } # 確保啟用 "std" feature 以使用 StdRng
rand_chacha = "0.3" # 引入一個具體的 PRNG 實現
use rand::{SeedableRng, Rng};
use rand_chacha::ChaCha8Rng; // 使用 ChaCha8Rng 作為範例
fn main() {
// 使用固定的種子創建一個隨機數生成器
let seed = [0; 32]; // 32 字節的種子
let mut rng = ChaCha8Rng::from_seed(seed);
let random_value1 = rng.gen_range(0..100);
println!("第一個隨機值: {}", random_value1);
let random_value2 = rng.gen_range(0..100);
println!("第二個隨機值: {}", random_value2);
// 如果再次使用相同的種子,將會得到相同的序列
let mut another_rng = ChaCha8Rng::from_seed(seed);
let another_value1 = another_rng.gen_range(0..100);
println!("再次使用相同種子得到的值: {}", another_value1);
}
總結
rand crate 為 Rust 提供了全面且安全的隨機數生成功能。無論是簡單的隨機數,從集合中選擇,還是需要自定義隨機數生成器,rand 都能滿足你的需求。記得在 Cargo.toml 中添加正確的依賴。
読み込み中...