簡體   English   中英

如何在Swift 4中防止函數生成相同的隨機數集

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM