簡體   English   中英

如何避免在 Swift 中連續兩次生成相同的隨機字符串?

[英]How to avoid generating the same random String twice in a row in Swift?

我試圖從 SQLite 數據庫中的字符串數組中獲取隨機值,而不是連續兩次獲得相同的值(相同的值應該能夠稍后再次出現,但不會立即出現)。 如何在 Swift 中實現這一點?

這取決於您何時能夠再次出現相同值的標准

您可以嘗試使用shuffleshuffled function 來洗牌您的數組,您可以從頭到尾獲取值,使其永遠不會顯示相同的值

let x = [1, 2, 3].shuffled()
// x == [2, 3, 1]

var numbers = [1, 2, 3, 4]
numbers.shuffle()
// numbers == [3, 2, 1, 4]

您可以創建一個 randomIndex 方法來返回一個隨機索引,您可以存儲在 var 中的先前索引除外。 因此,第一次傳遞 nil 時,它將返回集合的任何索引。 如果您傳遞最后一個隨機索引,只需將其從集合索引中刪除,返回一個新的隨機索引並在下次需要隨機索引時使用它來調用您的方法:

就像是:

extension RandomAccessCollection where Index == Int {
    func randomIndex(except index: Index? = nil) -> Index? {
        guard let index = index else { return indices.randomElement() }
        var indices = Array(self.indices)
        indices.remove(at: index)
        return indices.randomElement()
    }
}

用法:

class ViewController: UIViewController {
    let strings = ["One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten"]
    lazy var index = strings.randomIndex()! // this will return any index of the collection to start
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    var randomElement: String {
        // this will get the next random index after returning the random element
        defer { index = strings.randomIndex(except: index)! }
        return strings[index]
    }
}

游樂場測試:

let vc = ViewController()
vc.randomElement  // "Two"
vc.randomElement  // "Three"
vc.randomElement  // "Two"
vc.randomElement  // "Eight"
vc.randomElement  // "Nine"
vc.randomElement  // "Six"
vc.randomElement  // "One"
vc.randomElement  // "Four"
vc.randomElement  // "Six"
vc.randomElement  // "Five"
vc.randomElement  // "Eight"
vc.randomElement  // "Five"
vc.randomElement  // "Four"
vc.randomElement  // "Seven"
vc.randomElement  // "Four"

由於您只關心不重復該值作為下一個值,因此只需記住上一個值並拒絕下一個值,如果它與上一個值相同。

這是一個游樂場示例。 首先,我們嘗試這個最簡單的方法:

let pep = ["manny", "moe", "jack"]

func fetchRandomPep() -> String {
    return pep.randomElement()!
}

for _ in 1...100 {
    let result = fetchRandomPep()
    print(result)
}

好吧,你可能得到了很多重復的結果。 讓我們以不同的方式編寫循環來防止這種情況發生:

var prev = ""
for _ in 1...100 {
    var result = fetchRandomPep()
    while result == prev {
        result = fetchRandomPep()
    }
    prev = result
    print(result)
}

現在沒有重復了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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