代码在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)
答案 0 :(得分:2)
问题是,Int(arc4random())%windCard.count
会在0
到windCard.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)
我的方法是将你在每个循环中获得的随机数存储在临时文件或数据库中,然后比较新值,如果它们匹配,生成一个新的随机值,然后再次与文件或数据库进行比较,即使他们匹配你的方式确保你每次都获得真正的价值。希望这个“算法”可以帮助你。