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 测试

Download history 88/week @ 2024-03-13 122/week @ 2024-03-20 160/week @ 2024-03-27 107/week @ 2024-04-03 200/week @ 2024-04-10 187/week @ 2024-04-17 155/week @ 2024-04-24 197/week @ 2024-05-01 225/week @ 2024-05-08 145/week @ 2024-05-15 298/week @ 2024-05-22 248/week @ 2024-05-29 200/week @ 2024-06-05 174/week @ 2024-06-12 290/week @ 2024-06-19 216/week @ 2024-06-26

933 每月下载量
用于 28 个 Crates11 个直接使用)

Apache-2.0

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 没有实现 CopyClone,因此更难陷入同一种子被随意传递和重复使用的局面。

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