How to generate non‑overlapping random ranges (start,end),(start,end) in Rust

1 Answer

0 votes
use rand::Rng; // Required for the random_range trait method
use std::collections::HashSet;

fn generate_non_overlapping_random_ranges(begin: i32, end: i32, num_ranges: usize) -> Vec<(i32, i32)> {
    let count = num_ranges * 2;

    let mut rng = rand::rng(); 

    let mut points_set = HashSet::new();

    while points_set.len() < count {
        let r = rng.random_range(begin..end); 
        points_set.insert(r);
    }

    let mut points: Vec<i32> = points_set.into_iter().collect();
    points.sort();

    let mut ranges = Vec::new();
    for i in (0..points.len()).step_by(2) {
        ranges.push((points[i], points[i + 1]));
    }

    ranges
}

fn main() {
    let start = 1;
    let end = 500;
    let num_ranges = 8;

    let ranges = generate_non_overlapping_random_ranges(start, end, num_ranges);

    for (s, e) in ranges {
        println!("({}, {})", s, e);
    }
}



/*
run:

(19, 47)
(93, 127)
(161, 164)
(200, 243)
(276, 278)
(350, 385)
(407, 408)
(418, 426)

*/

 



answered Jan 28 by avibootz

Related questions

...