7 个版本 (breaking)
0.6.0 | 2023年10月18日 |
---|---|
0.5.0 | 2023年9月14日 |
0.4.0 | 2023年8月28日 |
0.3.1 | 2023年8月28日 |
0.1.0 | 2023年3月14日 |
#272 in 测试
933 每月下载量
用于 28 个 Crates(11 个直接使用)
13KB
268 行
seeded-random
此库封装了一些用于创建易于使用和传递的种子 RNG 的样板代码。
为什么使用种子 RNG?
大多数人想要一个随机数生成器只是想得到随机生成的数字。这很好,直到你需要编写测试、调试系统或意识到你只是想要一个纯粹的随机起点,而不是在整个平台上的真正随机决策。生成新地图的游戏或图像和音频的噪声等任务就是很好的例子,你只想要一个新的随机起点,但你希望由此产生的结果是可预测的、可重复的和确定的。这时,你处于需要可靠可重复的随机数的情况。这时你需要一个种子 RNG。
如何使用
use seeded_random::Random;
fn main() {
let rng = Random::new();
let random_u32 = rng.u32();
let random_string = rng.string(10);
println!("{}, {}", random_u32, random_string);
}
为 RNG 种子
您可以从任何 rng 生成新的 Seed
值。这允许您从中央种子 RNG 生成新的、独立的 RNG。
use seeded_random::{Random,Seed};
fn main() {
let rng = Random::new();
let new_seed = rng.seed();
let rng2 = Random::from_seed(new_seed);
assert_ne!(rng.u32(), rng2.u32());
assert_ne!(rng.string(10), rng2.string(10));
}
手动为 RNG 种子
您可以使用 u64
值通过 Seed::unsafe_new()
创建新的种子。这不是由于内存原因,而是因为 u64
值实现了 Copy
,你可以在多个位置轻松重用种子而不意识到你在做什么。
为多个 RNG 使用相同的种子将得到两个实例,这两个实例将生成完全相同的值,顺序也完全相同。这本身并不是一件坏事,除非你意外地遇到了这种情况。
该库中的 Seed
没有实现 Copy
或 Clone
,因此更难陷入同一种子被随意传递和重复使用的局面。
use seeded_random::{Random,Seed};
fn main() {
let seed = 10;
let seed1 = Seed::unsafe_new(seed);
let seed2 = Seed::unsafe_new(seed);
let rng1 = Random::from_seed(seed1);
let rng2 = Random::from_seed(seed2);
// As long as the same calls are made in order, the RNGs
// will stay in sync.
assert_eq!(rng1.u32(), rng2.u32());
assert_eq!(rng1.uuid(), rng2.uuid());
// When one RNG generates a single new value, it starts to deviate.
let _ = rng1.u32();
// Now they're generating different answers.
assert_ne!(rng1.string(10), rng2.string(10));
}
依赖关系
~0.7–6MB
~22K SLoC