首页 > 解决方案 > 洗牌随机的问题在哪里

问题描述

我真的不知道,如何改组答案。我有按钮集合(buttonA、buttonB、buttonC)和 var 答案

   let answer = [
       ["30","20","10"],
       ["cat", "dog", "butterfly"],
       ["flower", "sun", "tree"]
   ]

  for i in 0..<buttons.count{
            answer[i].shuffled(using: &RandomNumberGenerator)
            buttons[i].setTitle(self.answer[self.numberOfQuestion][i], for: .normal) //this row is ok
        }

这个答案我必须放入每个按钮,但不能放在同一个位置。正确答案总是在第一位,所以此时按钮A中的每一个正确答案都是正确的。

错误1:类型'RandomNumberGenerator.Protocol'不能符合'RandomNumberGenerator';只有结构/枚举/类类型可以符合协议

错误 2:无法将“RandomNumberGenerator.Protocol”类型的不可变值作为 inout 参数传递

我以前从未使用过洗牌。对不起这个原始问题,但我很快就开始了。谢谢

标签: swift

解决方案


TheRandomNumberGenerator是一个协议,但你不会使用它作为参数,而是可能提供一个符合该协议的对象。

但是你真的不需要担心这个。只需直接使用shuffled(or randomElement),无需提供随机数生成器。如果您只是想对这三个子数组中的每一个进行洗牌,您可以这样做:

let answers = [
    ["30","20","10"],
    ["cat", "dog", "butterfly"],
    ["flower", "sun", "tree"]
].map { $0.shuffled() }

这将产生如下内容:

[
    ["20", "10", "30"], 
    ["dog", "cat", "butterfly"], 
    ["tree", "sun", "flower"]
]

然后您可以执行以下操作:

for (index, button) in buttons.enumerated() {
    button.setTitle(answers[numberOfQuestion][index], for: .normal)
}

请注意,在进入按钮循环之前,我们已经移动了随机播放,因为这将确保答案不会重复。但是如果你想让答案重复,你可能根本不洗牌,而只是抓住一个随机元素:

let answers = [
    ["30", "20", "10"],
    ["cat", "dog", "butterfly"],
    ["flower", "sun", "tree"]
]

for button in buttons {
    button.setTitle(answers[numberOfQuestion].randomElement(), for: .normal)
}

推荐阅读