3 回答
TA贡献1862条经验 获得超6个赞
Swift 5更新
这是一个很好的技巧,可以从以前不仅仅选择的数字中进行平均选择。
您有10个数字,但只想从9个数字中选择(0到9,但不包括前一个数字)。如果将范围减少1,则可以从9个随机数中进行选择,然后将重复的数字替换为该范围的前一个最高数字。这样,您每次只需生成一个随机数即可获得统一性。
这可以Int.random(in:excluding:)在传递所需值的位置实现exclude。
extension Int {
static func random(in range: ClosedRange<Int>, excluding x: Int) -> Int {
if range.contains(x) {
let r = Int.random(in: Range(uncheckedBounds: (range.lowerBound, range.upperBound)))
return r == x ? range.upperBound : r
} else {
return Int.random(in: range)
}
}
}
例:
// Generate 30 numbers in the range 1...3 without repeating the
// previous number
var r = Int.random(in: 1...3)
for _ in 1...30 {
r = Int.random(in: 1...3, excluding: r)
print(r, terminator: " ")
}
print()
1 3 2 1 2 1 3 2 1 3 1 3 2 3 1 2 3 2 1 3 2 1 3 1 2 3 2 1 2 1 3 2 3 2 1 3 1 2 1 2
上一个答案:
var previousNumber = arc4random_uniform(10) // seed the previous number
func randomNumber() -> UInt32 {
var randomNumber = arc4random_uniform(9) // generate 0...8
if randomNumber == previousNumber {
randomNumber = 9
}
previousNumber = randomNumber
return randomNumber
}
- 3 回答
- 0 关注
- 591 浏览
添加回答
举报