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]
*/