use rand::{Rng, seq::IndexedRandom};
#[derive(Clone, Copy)]
enum Gender {
Boy,
Girl,
}
// X has two children
// at least one of them is a girl
// what is the probability of the other being a boy?
// options boy, girl - girl, boy - girl - girl
// boy - boy is impossible
fn main() {
let mut r = rand::rng();
let mut boys = 0f64;
let mut girls = 0f64;
let options = [Gender::Boy, Gender::Girl];
let mut count = 0u32;
loop {
let mut children = [
options.choose(&mut r).unwrap(),
options.choose(&mut r).unwrap(),
];
if r.random_bool(1.0 / 2.0) {
children[0] = &Gender::Girl;
} else {
children[1] = &Gender::Girl;
}
match children {
[Gender::Girl, Gender::Boy] | [Gender::Boy, Gender::Girl] => boys += 1f64,
_ => girls += 1f64,
}
count = count.wrapping_add(1);
if count % 1000 == 0 {
println!("{}", girls / (boys + girls));
}
}
}