Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Buy a domain name - Register cheap domain names from $0.99 - Namecheap

Scalable Hosting That Grows With You

Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Semrush - keyword research tool

Boost your online presence with premium web hosting and servers

Disclosure: My content contains affiliate links.

40,003 questions

51,950 answers

573 users

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

1 Answer

0 votes
import Foundation

func generateNonOverlappingRandomRanges(
    begin: Int,
    end: Int,
    numRanges: Int
) -> [(Int, Int)] {

    let count = numRanges * 2

    // ------------------------------------------------------------
    // Generate unique random points in [begin, end)
    // The random numbers are chaotic and NOT sorted
    // ------------------------------------------------------------
    var points = Set<Int>()

    while points.count < count {
        let r = Int.random(in: begin..<end)
        points.insert(r)   // Set ensures uniqueness
    }

    // ------------------------------------------------------------
    // Sort the points
    // Only AFTER sorting do the ranges become increasing
    // and automatically non‑overlapping
    // ------------------------------------------------------------
    let sortedPoints = points.sorted()

    // ------------------------------------------------------------
    // Pair adjacent sorted points into (start, end) ranges
    // ------------------------------------------------------------
    var ranges: [(Int, Int)] = []
    for i in stride(from: 0, to: sortedPoints.count, by: 2) {
        ranges.append((sortedPoints[i], sortedPoints[i + 1]))
    }

    return ranges
}

let start = 1
let end = 500
let numRanges = 8

let ranges = generateNonOverlappingRandomRanges(begin: start, end: end, numRanges: numRanges)

for (s, e) in ranges {
    print("(\(s), \(e))")
}



/*
run:

(76, 80)
(88, 164)
(179, 182)
(209, 248)
(273, 299)
(331, 335)
(351, 376)
(438, 456)

*/

 



answered Jan 28 by avibootz

Related questions

...