Как вывести все числа из этого словаря в случайном порядке, не повторяя их

Код вылетает после 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)

person Fernando Fuentes Martins    schedule 04.06.2018    source источник
comment
Подсказка: die будет значением от 0 до 9.   -  person rmaddy    schedule 04.06.2018
comment
но каждый раз, когда я удаляю значение, длина словаря становится короче   -  person Fernando Fuentes Martins    schedule 04.06.2018
comment
Хорошо, тогда значение die будет от 0 до windCard.count - 1. Итак, изначально 9 и с каждым разом уменьшается. 0 должно заставить вас пойти О!.   -  person rmaddy    schedule 04.06.2018
comment
проверьте это название ="как сгенерировать случайное число в Swift без повторения предыдущего случайного n"> stackoverflow.com/questions/27541145/   -  person Abdelahad Darwish    schedule 04.06.2018
comment
Я до сих пор не понимаю, код все еще работает только 3 раза, прежде чем сбой   -  person Fernando Fuentes Martins    schedule 04.06.2018


Ответы (2)


Проблема в том, что 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)
}
person Dávid Pásztor    schedule 04.06.2018

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

person Jorge Carretero    schedule 04.06.2018
comment
Зачем вам тратить время и ресурсы на хранение временных значений в файле/базе данных? Просто сохраните их в структуре данных в памяти. - person Dávid Pásztor; 04.06.2018