我对Swift和编程逻辑都不太了解,因此请耐心等待。
如何在Swift中生成0到9之间的随机数,而不重复上一个生成的数字?也就是说,同样的数字不会连续出现两次。
我对Swift和编程逻辑都不太了解,因此请耐心等待。
如何在Swift中生成0到9之间的随机数,而不重复上一个生成的数字?也就是说,同样的数字不会连续出现两次。
我的解决方案,我认为它很容易理解。
var nums = [0,1,2,3,4,5,6,7,8,9]
while nums.count > 0 {
// random key from array
let arrayKey = Int(arc4random_uniform(UInt32(nums.count)))
// your random number
let randNum = nums[arrayKey]
// make sure the number isnt repeated
nums.swapAt(arrayKey, nums.count-1)
nums.removeLast()
}
将前一个生成的数字存储在变量中,并将生成的数字与前一个数字进行比较。如果它们匹配,则生成一个新的随机数。重复生成新数字,直到它们不匹配。
var previousNumber: UInt32? // used in randomNumber()
func randomNumber() -> UInt32 {
var randomNumber = arc4random_uniform(10)
while previousNumber == randomNumber {
randomNumber = arc4random_uniform(10)
}
previousNumber = randomNumber
return randomNumber
}
randomNumber()
的调用都不能保证终止(即使在实践中它会迅速终止 :))。对于一个确定性解决方案(关于对randomNumber()
的程序流),请参见下面vacawama的巧妙答案。 - dfrib更新Swift 5
这里有一个不错的技巧,可以从之前没有选择过的数字中均等地选择。
你有10个数字,但你只想从9个数字中选择(0到9,但不包括之前选择的数字)。 如果你将范围减少1,你可以从9个随机数字中选择,然后仅用范围的上一个顶部数字替换重复的数字。通过这种方式,每次只需要生成一个随机数,就能获得均匀性。
这可以实现为Int.random(in:excluding:)
,其中你传递你想要排除
的值。
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()
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
}
let current = ...
var next: Int
repeat {
next = Int(arc4random_uniform(9))
} while current == next
// Use `next`