How to generate a random integer from a range [0, N] that is not in a unique integer list with Rust

1 Answer

0 votes
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

*/



answered Nov 19, 2025 by avibootz

Related questions

...