3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
Swift 5更新
這是一個(gè)很好的技巧,可以從以前不僅僅選擇的數(shù)字中進(jìn)行平均選擇。
您有10個(gè)數(shù)字,但只想從9個(gè)數(shù)字中選擇(0到9,但不包括前一個(gè)數(shù)字)。如果將范圍減少1,則可以從9個(gè)隨機(jī)數(shù)中進(jìn)行選擇,然后將重復(fù)的數(shù)字替換為該范圍的前一個(gè)最高數(shù)字。這樣,您每次只需生成一個(gè)隨機(jī)數(shù)即可獲得統(tǒng)一性。
這可以Int.random(in:excluding:)在傳遞所需值的位置實(shí)現(xiàn)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
上一個(gè)答案:
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 關(guān)注
- 840 瀏覽
添加回答
舉報(bào)