How to generate N random integers, each with distinct digits and exact length L in Rust

1 Answer

0 votes
use rand::rng;
use rand::seq::index;
use std::collections::HashSet;

/// Generate one distinct‑digit integer of length `len`
/// using index::sample instead of random_range.
fn generate_distinct_digit_number(len: usize) -> u64 {
    let mut rng = rng(); // thread‑local RNG (rand 0.9+)

    loop {
        // We need to generate a number in [10^(len-1), 10^len - 1]
        let lower = 10u64.pow((len - 1) as u32);
        let upper = 10u64.pow(len as u32) - 1;

        // Instead of rng.random_range, we sample indices without replacement.
        //
        // We choose (len - 1) cut points in [1, range_size - 1]
        // This is just an example of using index::sample with rng().
        let range_size = (upper - lower + 1) as usize;

        // Sample (len - 1) distinct indices from 0..range_size
        let sample = index::sample(&mut rng, range_size, len - 1);

        // Pick one of the sampled indices as the candidate number
        let idx = sample.index(0);
        let num = lower + idx as u64;

        // Check digit uniqueness
        let s = num.to_string();
        let mut seen = HashSet::new();

        if s.chars().all(|c| seen.insert(c)) {
            return num;
        }
    }
}

/// Generate N numbers with distinct digits and exact length L.
fn generate_numbers(n: usize, len: usize) -> Vec<u64> {
    let mut results = Vec::new();
    while results.len() < n {
        let num = generate_distinct_digit_number(len);
        results.push(num);
    }
    results
}

fn main() {
    let nums = generate_numbers(10, 6);
    println!("{:?}", nums);
}



/*
run:

[680523, 986317, 658730, 482195, 801635, 214786, 423760, 851340, 954370, 246781]

*/

 



answered Jul 16 by avibootz

Related questions

...