use rand::{Rng, SeedableRng};
use rand::rngs::StdRng;
use std::collections::HashSet;
use std::time::{SystemTime, UNIX_EPOCH};
fn random_excluding(n: i32, excluded: &[i32]) -> i32 {
if excluded.len() > (n + 1) as usize {
return -1;
}
// Get the current time in nanoseconds
let seed = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_nanos() as u64;
// Create a seeded RNG
let mut rng = StdRng::seed_from_u64(seed);
// Convert excluded slice into a HashSet for fast lookup
let excluded_set: HashSet<i32> = excluded.iter().cloned().collect();
loop {
// Generate a random number in [0, n]
let num = rng.random_range(0..=n);
if !excluded_set.contains(&num) {
return num;
}
}
}
fn main() {
let excluded = vec![2, 5, 7];
let n = 14;
let result = random_excluding(n, &excluded);
println!("{}", result);
}
/*
run:
9
*/