Prüfsumme und wiederholbarer Zufall

FNV-1a für Zustandsprüfsummen und SplitMix64 als einzige Zufallsquelle
des Kerns. Beide sind gegen veröffentlichte Referenzwerte geprüft.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Steven Wroblewski
2026-09-30 20:24:15 +02:00
parent 4eed8efed0
commit 4df328243c
5 changed files with 115 additions and 0 deletions
+49
View File
@@ -0,0 +1,49 @@
use grovewright_core::rng::Rng;
#[test]
fn matches_the_splitmix64_reference_values() {
let mut rng = Rng::new(0);
assert_eq!(rng.next_u64(), 0xE220_A839_7B1D_CDAF);
assert_eq!(rng.next_u64(), 0x6E78_9E6A_A1B9_65F4);
assert_eq!(rng.next_u64(), 0x06C4_5D18_8009_454F);
}
#[test]
fn the_same_seed_gives_the_same_sequence() {
let mut a = Rng::new(2026);
let mut b = Rng::new(2026);
for _ in 0..1_000 {
assert_eq!(a.next_u64(), b.next_u64());
}
}
#[test]
fn different_seeds_give_different_sequences() {
assert_ne!(Rng::new(1).next_u64(), Rng::new(2).next_u64());
}
#[test]
fn below_stays_inside_the_bound() {
let mut rng = Rng::new(7);
for bound in [1u32, 2, 3, 10, 100, 1_000_000, u32::MAX] {
for _ in 0..1_000 {
assert!(rng.below(bound) < bound);
}
}
}
#[test]
fn below_reaches_every_value_of_a_small_bound() {
let mut rng = Rng::new(99);
let mut seen = [false; 6];
for _ in 0..1_000 {
seen[rng.below(6) as usize] = true;
}
assert_eq!(seen, [true; 6]);
}
#[test]
#[should_panic(expected = "bound must be greater than zero")]
fn below_refuses_a_bound_of_zero() {
Rng::new(1).below(0);
}