【问题标题】:How to avoid generating the same random String twice in a row in Swift?如何避免在 Swift 中连续两次生成相同的随机字符串?
【发布时间】:2021-01-20 02:12:21
【问题描述】:

我正在尝试从 SQLite 数据库中的字符串数组中获取随机值,而不是连续两次获取相同的值(相同的值应该能够稍后再次出现,但不能立即出现)。如何在 Swift 中实现这一点?

【问题讨论】:

    标签: arrays swift random


    【解决方案1】:

    由于您只关心不将值重复为下一个值,因此只需记住上一个值,如果与上一个值相同则拒绝下一个值。

    这是一个游乐场示例。首先,我们试试这个最简单的方法:

    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)
    }
    

    现在没有重复了!

    【讨论】:

      【解决方案2】:

      这取决于您何时可以再次出现相同值的标准

      您可以尝试使用shuffleshuffled 函数来打乱您的数组,您可以从第一个到最后一个获取值,使其永远不会显示相同的值

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

      【讨论】:

        【解决方案3】:

        您可以创建一个 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"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-05
          • 1970-01-01
          • 2013-04-28
          • 2020-12-14
          • 2018-06-16
          • 1970-01-01
          相关资源
          最近更新 更多