1 快速入门
原文链接: https://rust-random.github.io/book/quick-start.html
下面列出一个简短示例。更多内容请参阅 API 文档或指南。
让我们从一个示例开始:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| // 从 prelude 导入常用项:
use rand::prelude::*;
fn main() {
// 我们可以立即使用 random()。它可以生成多种常见类型的值:
let x: u8 = rand::random();
println!("{}", x);
if rand::random() { // 生成一个布尔值
println!("Heads!");
}
// 如果我们想更明确一些(也更高效一点),可以
// 获取线程局部生成器的句柄:
let mut rng = rand::rng();
if rng.random() { // 随机布尔值
let x: f64 = rng.random(); // [0, 1) 范围内的随机数
let y = rng.random_range(-10.0..10.0);
println!("x is: {}", x);
println!("y is: {}", y);
}
println!("Dice roll: {}", rng.random_range(1..=6));
println!("Number from 0 to 9: {}", rng.random_range(0..10));
// 有时直接使用分布会很有用:
let distr = rand::distr::Uniform::new_inclusive(1, 100).unwrap();
let mut nums = [0i32; 3];
for x in &mut nums {
*x = rng.sample(distr);
}
println!("Some numbers: {:?}", nums);
// 我们也可以与迭代器和切片交互:
let arrows_iter = "➡⬈⬆⬉⬅⬋⬇⬊".chars();
println!("Lets go in this direction: {}", arrows_iter.choose(&mut rng).unwrap());
let mut nums = [1, 2, 3, 4, 5];
nums.shuffle(&mut rng);
println!("I shuffled my {:?}", nums);
}
|
你可能注意到的第一件事是我们从 prelude 导入了所有内容。这是使用 rand 的简便方式,与标准库的 prelude 类似,只导入最常用的项。如果你不想使用 prelude,请记得导入 Rng trait!
Rand 库会在需要时自动初始化一个安全的、线程局部的生成器。可通过 rng() 和 random 函数访问。关于此主题的更多信息,请参阅随机生成器。
虽然 random 函数只能以 StandardUniform(类型相关)的方式采样值,但 rng() 会给你一个生成器句柄。所有生成器都实现了 Rng trait,它提供了上文使用的 random、random_range 和 sample 方法。
Rand 通过另外两个 trait——IteratorRandom 和 SliceRandom——为迭代器和切片提供功能。
固定种子的 RNG
你可能注意到了上文对 rand::rng() 的使用,并想知道如何指定固定种子。为此,你需要指定一个 RNG,然后使用 seed_from_u64 或 from_seed 等方法。
请注意,seed_from_u64 不适合用于加密用途,因为单个 u64 无法提供足够的熵来安全地播种 RNG。所有加密 RNG 都通过 from_seed 接受更合适的种子。
下文使用 ChaCha8Rng,因为它快速、可移植且质量良好。更多 RNG 请参阅 RNG 一节,但如果你关心可重现的结果,请避免使用 SmallRng 和 StdRng。
1
2
3
4
5
6
| use rand::{rngs::ChaCha8Rng, RngExt, SeedableRng};
fn main() {
let mut rng = ChaCha8Rng::seed_from_u64(10);
println!("Random f32: {}", rng.random::<f32>());
}
|