4df328243c
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>
50 lines
1.2 KiB
Rust
50 lines
1.2 KiB
Rust
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);
|
|
}
|