1pub fn squirrel_noise(step: u32, seed: Option<u32>) -> f32 {
9 let bit_noise1: u32 = 0x68E31DA4;
10 let bit_noise2: u32 = 0xB5297A4D;
11 let bit_noise3: u32 = 0x1B56C4E9;
12
13 let mut mangled_bits: u32 = step;
14 mangled_bits = u32::wrapping_mul(mangled_bits, bit_noise1);
15 mangled_bits = u32::wrapping_add(mangled_bits, seed.unwrap_or(0));
16 mangled_bits ^= mangled_bits >> 8;
17 mangled_bits = u32::wrapping_add(mangled_bits, bit_noise2);
18 mangled_bits ^= mangled_bits << 8;
19 mangled_bits = u32::wrapping_mul(mangled_bits, bit_noise3);
20 mangled_bits ^= mangled_bits >> 8;
21
22 let max: u32 = 0xFFFFFFFF;
23 mangled_bits as f32 / max as f32
24}
25
26pub fn seeded_squirrel_noise(seed: u32) -> impl Fn(u32) -> f32 {
30 move |step: u32| { squirrel_noise(step, Some(seed)) }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36
37 #[test]
38 fn test_squirrel_noise() {
39 let length = 100;
40 for seed in 0..1000 {
41 let noise_sequence = (0..length).map(|step| squirrel_noise(step, Some(seed)));
42
43 let mean: f32 = noise_sequence.clone().sum::<f32>() / (length as f32);
44 assert!(mean > 0.4 && mean < 0.6);
45
46 for noise in noise_sequence {
47 assert!(noise >= 0.0);
48 assert!(noise <= 1.0);
49 }
50 }
51 }
52}