如何以随机顺序打印此字典中的所有数字而不重复它们

时间:2018-06-04 16:13:08

标签: arrays swift dictionary arc4random

代码在3次尝试后崩溃。 如何设置打印所有10个值而不重复它们?

var windCard = [1:11,  2:12,  3:21,  4:22,  5:31,  6:32,  7:41,  8:42, 9:51, 10:52 ]

var die = 0
die = Int(arc4random())%windCard.count

print("The wind blow the mosquitoes \(windCard[Int(die)]!)")
windCard.removeValue(forKey: die)

2 个答案:

答案 0 :(得分:2)

问题是,Int(arc4random())%windCard.count会在0windCard.count-1范围内生成密钥,而您的密钥从1开始,在您删除第一个元素后,密钥就会赢得&#t甚至是连续的。例如,如果您从Dictionary的中间删除密钥(让我们说密钥5),windCard将有9个元素,因此die将在0-8范围内,但您的Dictionary将丢失密钥,因此如果windCard[key]!die,您的代码将在5上崩溃。

您可以使用arc4random_uniform来实现目标,upperBound接受keys输入参数,并使用生成的随机数代替windCard {{1}的Dictionary这将保证是连续的。

while windCard.count > 0 {
    let die = Int(arc4random_uniform(UInt32(windCard.keys.count)))
    let key = Array(windCard.keys)[die]
    print("The wind blow the mosquitoes \(windCard[key]!)")
    windCard.removeValue(forKey: key)
}

答案 1 :(得分:0)

我的方法是将你在每个循环中获得的随机数存储在临时文件或数据库中,然后比较新值,如果它们匹配,生成一个新的随机值,然后再次与文件或数据库进行比较,即使他们匹配你的方式确保你每次都获得真正的价值。希望这个“算法”可以帮助你。