var array: [Int] = []
//Here I make an array to try to dictate when to perform an IBaction.
func random() -> Int {
let rand = arc4random_uniform(52)*10+10
return Int(rand)
}
//this function makes a random integer for me
func finalRand() -> Int {
var num = random()
while (array.contains(num) == true){
if (num == 520){
num = 10
}else {
num += 10
}
}
array.append(num)
return num
}
答案 0 :(得分:0)
while语句中的逻辑有些混乱,但是您可以尝试以下方法:
var array:Array<Int> = []
func finalRand() -> Int {
var num = Int(arc4random_uniform(52)*10+10)
while array.contains(num) {
num = Int(arc4random_uniform(52)*10+10)
}
array.append(num)
return num
}
这样,就不会重复,而且锅炉代码也更少。
可能有一个更好的方法涉及Sets,但是很抱歉,我对此了解不多。
答案 1 :(得分:0)
几件事:
一旦数组具有所有52个值,由于所有52个值都已存在于数组中,因此尝试添加第53个数字将导致无限循环。
在现代Swift版本中,您可以将random
例程简化为
func random() -> Int {
return Int.random(in: 1...52) * 10
}
似乎您可能需要52个不同值的混洗数组,可以将其减少为:
let array = Array(1...52).map { $0 * 10 }
.shuffled()
只需遍历经过改组的值数组即可。
如果在完成所有值操作后确实需要继续生成数字,则可以例如重新排列数组,然后从新重新排列的数组的开头开始。
顺便说一句,您的例程不会生成真正的随机序列。例如,假设您的代码恰好填充了10到500的值,只有510和520是最终可能的剩余值:对于下一个值,您的例程生成520的可能性是520的51倍。您希望像内置shuffled
例程那样进行Fisher-Yates随机播放,以生成真正均匀分布的一系列值。只需生成可能值的数组并对其进行随机排序即可。