Permutation test: Difference between revisions

Content deleted Content added
Alextretyak (talk | contribs)
Added 11l
Add Rust implementation
Line 1,517: Line 1,517:
<pre>
<pre>
under=87.20%, over=12.80%
under=87.20%, over=12.80%
</pre>

=={{header|Rust}}==
<lang rust>
fn main() {
let treatment = vec![85, 88, 75, 66, 25, 29, 83, 39, 97];
let control = vec![68, 41, 10, 49, 16, 65, 32, 92, 28, 98];

let mut data_set = control.clone();
data_set.extend_from_slice(&treatment);

let greater = combinations(treatment.iter().sum(), treatment.len() as i64, &data_set) as f64;
let lesser = combinations(control.iter().sum(), control.len() as i64, &data_set) as f64;
let total = binomial(data_set.len() as i64, treatment.len() as i64) as f64;

println!("<= : {}%", (lesser / total * 100.0));
println!(" > : {}%", (greater / total * 100.0));
}

fn factorial(x: i64) -> i64 {
let mut product = 1;
for a in 1..(x + 1) {
product *= a;
}
product
}

fn binomial(n: i64, k: i64) -> i64 {
let numerator = factorial(n);
let denominator = factorial(k) * factorial(n - k);
numerator / denominator
}

fn combinations(total: i64, number: i64, data: &[i64]) -> i64 {
if total < 0 {
return binomial(data.len() as i64, number);
}

if number == 0 {
return 0;
}

if number > data.len() as i64 {
return 0;
}

if number == data.len() as i64 {
if total < data.iter().sum() {
return 1;
} else {
return 0;
}
}

let tail = &data[1..];
combinations(total - data[0], number - 1, &tail) + combinations(total, number, &tail)
}
</lang>
{{out}}
<pre>
<= : 86.8583428954946%
> : 12.80283184307952%
</pre>
</pre>