broader randomrange extensions

This commit is contained in:
2024-08-22 05:57:03 +10:00
parent 6a57a8580e
commit b24d154c93
3 changed files with 106 additions and 10 deletions

View File

@ -17,12 +17,37 @@ public class Arc4Random: RandomProvider {
arc4random()
}
public func next(in bound: Int) -> Int {
assert(bound <= Self.max)
return Int(arc4random_uniform(UInt32(bound)))
func next(in bound: UInt32) -> UInt32 {
return arc4random_uniform(bound)
}
public func next(in range: Range<Int>) -> Int {
return range.lowerBound + next(in: range.upperBound - range.lowerBound)
func next(in bound: Int) -> Int {
assert(bound <= UInt32.max, "Maximum raw random provider output is smaller than requested bound")
return Int(arc4random_uniform(UInt32(bound)))
}
}
public extension Arc4Random {
func next(in range: Range<UInt32>) -> UInt32 {
assert(!range.isEmpty, "Ranged next called with empty range")
return range.lowerBound + next(in: range.upperBound - range.lowerBound)
}
func next(in range: ClosedRange<UInt32>) -> UInt32 {
if range == 0...UInt32.max {
next()
} else {
next(in: range.upperBound - range.lowerBound + 1)
}
}
func next(in range: Range<Int>) -> Int {
assert(!range.isEmpty, "Ranged next called with empty range")
return range.lowerBound + next(in: range.upperBound - range.lowerBound)
}
func next(in range: ClosedRange<Int>) -> Int {
assert(range.upperBound - range.lowerBound < Int.max, "Closed range exceeds Int.max")
return range.lowerBound + next(in: range.upperBound - range.lowerBound + 1)
}
}