[英]How to prevent function from generating same sets of random number in Swift 4
我开发了一些代码来生成1到49之间的六个数字组成的五个数组。我使用arc4random_uniform(49)
函数尝试做到这一点。 但是,当appendArrays()
为所有五个循环生成相同的一组数字时。
class six49: lottery {
var price: Int
var winner: [Int] = []
override init(draws: Int, lines: Int){
price = 3
super.init(draws: draws, lines: lines)
}
func appendArrays(win: inout [Int], win2: inout [[Int]]) -> [[Int]] {
while win2.count < lines {
while win.count < 6 {
let selection = arc4random_uniform(49)
if win.contains(Int(selection)){
continue
} else {
win.append(Int(selection))
win = win.sorted()
}
}
win2.append(win)
}
return win2
}
}
let result = six49(draws: 1, lines: 5)
var arr2: [[Int]] = []
var arr1: [Int] = []
var collection = result.appendArrays(win: &arr1,win2: &arr2)
print(collection)
输出如下:
[[11,16,27,31,37,39],[11,16,27,31,37,39],[11,16,27,31,37,39],[11,16,27, 31,37,39],[11,16,27,31,37,39]]
我一直在到处寻找尝试在每个循环中创建不同的数字集,但是我似乎找不到任何解决方案。
您的问题是您永远不会重新初始化win
数组。 一旦有6
数字,它就永远不会改变,因此您只需将相同的win
数组追加到win2
数组中即可。
而不是将win
作为inout [Int]
传递到您的appendArrays
方法中, appendArrays
每次在主循环中创建一个新的win
数组。
func appendArrays(win2: inout [[Int]]) -> [[Int]] {
while win2.count < lines {
var win = [Int]()
while win.count < 6 {
let selection = arc4random_uniform(49)
if win.contains(Int(selection)){
continue
} else {
win.append(Int(selection))
win = win.sorted()
}
}
win2.append(win)
}
return win2
}
另外,不清楚为什么要传入win2
,因为appendArrays
无论如何appendArrays
返回最终值。 您可以在函数内部创建win2
。
此外,您可以对数组进行一次排序,然后再将其添加到win2
。
如果要在1...49
数字,则需要在arc4random_uniform(49)
数字中添加1
。
func appendArrays() -> [[Int]] {
var win2 = [[Int]]()
while win2.count < lines {
var win = [Int]()
while win.count < 6 {
let selection = Int(arc4random_uniform(49) + 1)
if !win.contains(selection) {
win.append(selection)
}
}
win.sort()
win2.append(win)
}
return win2
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.