检查值是否在范围内,否则计算最接近的值

时间:2018-02-25 09:50:51

标签: swift math random numbers

我有这些价值:

let previous = 170
let min = 100
let max = 800

所以我正在做的是我在minmax之间生成一个随机数,并遵循以下规则:

  • min不少于100
  • max不超过800
  • 我只想从previous获得+200或从previous
  • 获得-200

因此,对于上面的例子,随机数应该在:
之间 min:100和max 370。

Min为100,因为min不能小于100而max基本上是前一个:170 + 200。

我尝试了"pattern-match" operator ~=:,但感觉不适合在这里做。

有关如何解决此问题的任何想法?

1 个答案:

答案 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