use rand::SeedableRng;
use rand_chacha::ChaCha8Rng;
pub(crate) fn substream(master_seed: u64, index: u64) -> ChaCha8Rng {
let mut z = master_seed ^ index.wrapping_mul(0x9E37_79B9_7F4A_7C15);
z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
z ^= z >> 31;
ChaCha8Rng::seed_from_u64(z)
}
pub(crate) fn median(v: &mut [f64]) -> f64 {
v.sort_unstable_by(f64::total_cmp);
let n = v.len();
let mid = n / 2;
if n % 2 == 1 {
v[mid]
} else {
0.5 * (v[mid - 1] + v[mid])
}
}