文章目錄
- 生成隨機值
- 生成隨機數
- 生成范圍內隨機數
- 生成自定義類型隨機值
- 從一組字母數字字符創建隨機密碼
- 從一組用戶定義字符創建隨機密碼
- 總結
生成隨機值
rust中官方并沒有像以他語言一樣,rust并沒有官方并沒有提供生成隨機數的工具,所以我們要借助rand包進行生成隨機數。這里我們使用現在使用罪為廣泛的rand包只需要引入以下依賴就能夠使用。rand = "0.8.5"
生成隨機數
在隨機數生成器 rand::Rng 的幫助下,通過 rand::thread_rng 生成隨機數。可以開啟多個線程,每個線程都有一個初始化的生成器。整數在其類型范圍內均勻分布,浮點數是從 0 均勻分布到 1,但不包括 1。
use rand::Rng;fn main() {let mut rng = rand::thread_rng();let n1: u8 = rng.gen();let n2: u16 = rng.gen();println!("Random u8: {}", n1);println!("Random u16: {}", n2);// 改變類型println!("Random u32: {}", rng.gen::<u32>());println!("Random i32: {}", rng.gen::<i32>());println!("Random float: {}", rng.gen::<f64>());
}
結果
Random u8: 247
Random u16: 46458
Random u32: 2649532043
Random i32: 1393744920
Random float: 0.5923489382636902
生成范圍內隨機數
使用 Rng::gen_range,在半開放的 [0, 10) 范圍內(不包括 10)生成一個隨機值。
use rand::Rng;fn main() {let mut rng = rand::thread_rng();println!("Integer: {}", rng.gen_range(0..10));println!("Float: {}", rng.gen_range(0.0..10.0));
}
結果
let mut rng = rand::thread_rng();println!("Integer: {}", rng.gen_range(0..10));println!("Float: {}", rng.gen_range(0.0..10.0));
使用 Uniform 模塊可以得到均勻分布的值。下述代碼和上述代碼具有相同的效果,但在相同范圍內重復生成數字時,下述代碼性能可能會更好。
use rand::distributions::{Distribution, Uniform};fn main() {let mut rng = rand::thread_rng();let die = Uniform::from(1..7);loop {let throw = die.sample(&mut rng);println!("Roll the die: {}", throw);if throw == 6 {break;}}
}
結果
Roll the die: 1
Roll the die: 2
Roll the die: 6
生成自定義類型隨機值
隨機生成一個元組 (i32, bool, f64) 和用戶定義類型為 Point 的變量。為 Standard 實現 Distribution trait,以允許隨機生成。
use rand::Rng;
use rand::distributions::{Distribution, Standard};#[derive(Debug)]
struct Point {x: i32,y: i32,
}impl Distribution<Point> for Standard {fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Point {let (rand_x, rand_y) = rng.gen();Point {x: rand_x,y: rand_y,}}
}fn main() {let mut rng = rand::thread_rng();let rand_tuple = rng.gen::<(i32, bool, f64)>();let rand_point: Point = rng.gen();println!("Random tuple: {:?}", rand_tuple);println!("Random Point: {:?}", rand_point);
}
結果
Random tuple: (590118681, false, 0.7548409339548463)
Random Point: Point { x: 914499268, y: 795986012 }
從一組字母數字字符創建隨機密碼
隨機生成一個給定長度的 ASCII 字符串,范圍為 A-Z,a-z,0-9,使用字母數字樣本。
use rand::{thread_rng, Rng};
use rand::distributions::Alphanumeric;fn main() {let rand_string: String = thread_rng().sample_iter(&Alphanumeric).take(30).map(char::from).collect();println!("{}", rand_string);
}
結果
fwaZUzdIkK1p78fyNvh44Od5gcr3BL
從一組用戶定義字符創建隨機密碼
使用用戶自定義的字節字符串,使用 gen_range 函數,隨機生成一個給定長度的 ASCII 字符串。
use rand::Rng;
fn main() {const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyz\0123456789)(*&^%$#@!~";const PASSWORD_LEN: usize = 30;let mut rng = rand::thread_rng();let password: String = (0..PASSWORD_LEN).map(|_| {let idx = rng.gen_range(0..CHARSET.len());CHARSET[idx] as char}).collect();println!("{:?}", password);
}
結果
"F@QNgOrsviJ2tqM$zOSJSR^Hjevvce"
總結
以上就是rand包的簡單使用,如果想要更要了解rand包的使用,還要多查閱官方文檔