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 關注
- 652 瀏覽
添加回答
舉報