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

How to print all numbers from this dictionary in a random order without repeating them

代码在尝试 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)

问题是 Int(arc4random())%windCard.count 生成 0windCard.count-1 范围内的键,而你的键从 1 开始,在你删除第一个元素后,键不会甚至是连续的。因此,例如,如果您从 Dictionary 中间删除一个键(假设键 5),windCard 将有 9 个元素,因此 die 将在范围内0-8,但是您的 Dictionary 将缺少一个密钥,因此如果 die5,您的代码将在 windCard[key]! 上崩溃。

您可以通过使用 arc4random_uniform 来实现您的目标,它接受一个 upperBound 输入参数,并使用生成的随机数为 windCard [的 keys 添加下标 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)
}

我的方法是将你在每个循环中得到的随机数存储在一个临时文件或数据库中,然后比较新值,如果它们匹配,生成一个新的随机值,然后再次与文件或数据库进行比较,这样即使它们与您匹配,也能确保您每次都能获得真正的价值。希望这篇"algorithm"对你有帮助。