我有这些价值:
let previous = 170
let min = 100
let max = 800
所以我正在做的是我在min
和max
之间生成一个随机数,并遵循以下规则:
min
不少于100 max
不超过800 previous
获得+200或从previous
因此,对于上面的例子,随机数应该在:
之间
min:100和max 370。
Min
为100,因为min不能小于100而max
基本上是前一个:170 + 200。
我尝试了"pattern-match" operator ~=:
,但感觉不适合在这里做。
有关如何解决此问题的任何想法?
答案 0 :(得分:4)
你可以"钳制" (或"限制")范围到另一个范围:
let previous = 170
let min = 100
let max = 800
let range = (previous-200...previous+200).clamped(to: min...max)
print(range.lowerBound, range.upperBound) // 100 370
现在计算缩小范围内的随机数:
let r = range.lowerBound + Int(arc4random_uniform(UInt32(range.count)))
有关详细信息,请参阅clamped(to:)
。特别是,
如果范围不重叠则结果为
给定限制内最接近接收器的单元素范围:
let previous = 2000
let min = 100
let max = 800
let range = (previous-200...previous+200).clamped(to: min...max)
print(range.lowerBound, range.upperBound) // 800 800