import scala.util.Random
object NonOverlappingRanges {
def generateNonOverlappingRandomRanges(begin: Int, end: Int, numRanges: Int): List[(Int, Int)] = {
val count = numRanges * 2
// ------------------------------------------------------------
// Generate unique random points in [begin, end)
// The random numbers are chaotic and NOT sorted
// ------------------------------------------------------------
val rng = new Random()
val pointsSet = Iterator
.continually(begin + rng.nextInt(end - begin))
.distinct // ensure uniqueness
.take(count) // collect exactly count unique points
.toList
// ------------------------------------------------------------
// Sort the points
// Only AFTER sorting do the ranges become increasing
// and automatically non‑overlapping
// ------------------------------------------------------------
val sortedPoints = pointsSet.sorted
// ------------------------------------------------------------
// Pair adjacent sorted points into (start, end) ranges
// ------------------------------------------------------------
sortedPoints
.grouped(2)
.collect { case List(a, b) => (a, b) }
.toList
}
def main(args: Array[String]): Unit = {
val start = 1
val end = 500
val numRanges = 8
val ranges = generateNonOverlappingRandomRanges(start, end, numRanges)
ranges.foreach { case (s, e) => println(s"($s, $e)") }
}
}
/*
run:
(41, 46)
(47, 56)
(69, 93)
(112, 130)
(131, 154)
(233, 251)
(317, 386)
(392, 484)
*/