Как напечатать все цифры из этого словаря в случайном порядке, не повторяя их - PullRequest
0 голосов
/ 04 июня 2018

Код вылетает после 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 голосов
/ 04 июня 2018

Мой подход заключается в том, чтобы хранить случайное число, которое вы получаете в каждом цикле, во временном файле или базе данных, затем сравнивать новые значения, если они совпадают, генерировать новое случайное значение, а затем снова сравнивать с файлом или базой данных, чтоКстати, даже если они совпадают, вы гарантируете, что каждый раз получаете истинную ценность.Надеюсь, этот «алгоритм» поможет вам.

0 голосов
/ 04 июня 2018

Проблема в том, что Int(arc4random())%windCard.count генерирует ключи в диапазоне от 0 до windCard.count-1, в то время как ваши ключи начинаются с 1 и после удаления первого элемента, ключи даже не будут смежными.Так, например, если вы удалите ключ из середины Dictionary (скажем, ключ 5), windCard будет иметь 9 элементов и, следовательно, die будет в диапазоне 0-8, но ваш Dictionary будет отсутствовать ключ, поэтому ваш код будет аварийно завершен на windCard[key]!, если die равен 5.

Вы можете достичь своей цели, используя arc4random_uniform, который принимает входной аргумент upperBoundи использовать сгенерированное случайное число для индексации keys вашего windCard 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)
}
...