use strafe_type::{FloatConstraint, Natural64, Real64};
use crate::traits::RNG;
pub fn rwilcox<N1: Into<Natural64>, N2: Into<Natural64>, R: RNG>(
m: N1,
n: N2,
rng: &mut R,
) -> Real64 {
let mut m = m.into().unwrap();
let mut n = n.into().unwrap();
let mut i = 0;
let mut j = 0;
let mut k = 0;
let mut r = 0.0;
m = m.round();
n = n.round();
r = 0.0;
k = (m + n) as usize;
let mut x = vec![0; k];
i = 0;
while i < k {
x[i] = i;
i += 1
}
i = 0;
while (i as f64) < n {
j = rng.unif_index(k as f64) as usize;
r += x[j] as f64;
k -= 1;
x[j] = x[k];
i += 1
}
(r - n * (n - 1.0) / 2.0).into()
}