我对Swift和编程逻辑都很陌生,所以请耐心等待
如何在Swift中生成0到9之间的随机数,而不重复上一次生成的数字?因为同样的数字不会连续两次出现。
答案 0 :(得分:17)
我的解决方案,我认为它易于理解
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.removeAtIndex(arrayKey)
}
答案 1 :(得分:11)
将先前生成的数字存储在变量中,并将生成的数字与之前的数字进行比较。如果匹配则生成新的随机数。重复生成新数字直到它们不匹配。
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
}
答案 2 :(得分:4)
这是一个很好的技巧,可以从之前选择的数字中同等地选择。
您有10个号码,但您只想从9个号码中选择(0到9,但不包括前一个号码)。 如果将范围缩小1,则可以从9个随机数中选择,然后将重复的数字替换为范围的前一个最大数字。通过这种方式,您每次只需生成一个随机数,就可以获得一致性:
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 :(得分:2)
最简单的方法是使用repeat / while:
let current = ...
var next: Int
repeat {
next = Int(arc4random_uniform(9))
} while current == next
// Use `next`
答案 4 :(得分:0)
将所需的所有值放入数组中,使用arc4random_uniform(SIZEOFARRAY)生成随机数,并从数组中提取随机值的索引,然后重复此过程直到数组为空。
答案 5 :(得分:0)
这是一种直观的方法:记住以前“选择”随机元素的索引,并在下次“选择”随机元素时暂时消除该索引的元素。
对Array进行一些扩展将很有用:
extension Array {
func without(_ ix:Int) -> Array<Element> {
var arr = self; arr.remove(at:ix); return arr
}
}
好的,我们开始:
let pep = ["Manny", "Moe", "Jack"]
let ixs = Array(pep.indices)
var prev = ixs.randomElement()!
for _ in 1...20 {
print(pep[prev])
prev = ixs.without(prev).randomElement()!
}
典型运行结果:
Manny
Moe
Manny
Jack
Manny
Moe
Manny
Moe
Jack
Moe
Jack
Moe
Manny
Jack
Manny
Moe
Jack
Manny
Moe
Jack
如您所见,它们看起来很随意,但是没有立即重复。