Программирование под iOS: как заставить arc4_random не повторяться с помощью цикла do while

В этом коде 2-я строка проходит через массив и выводит то, что он получает, и его случайные значения. Но иногда я слышу одно и то же дважды, например, «Штрауб», затем «Штрауб», а затем что-то еще, например «Рашер». Я пытался сделать цикл «do while», но не знаю, как настроить его так, чтобы он не повторялся. Кстати, это быстрый язык программирования.

let types = ["Alex", "Straub", "Rusher", "Graser"]

let type = types[Int(arc4random_uniform(UInt32(types.count)))]

println(type)

Если у вас есть вопросы, напишите их в комментариях.


person alex    schedule 05.10.2014    source источник
comment
Когда вы бросаете кости, есть шанс получить одно и то же число дважды подряд ...   -  person zisoft    schedule 05.10.2014
comment
Можете ли вы опубликовать больше своего кода?   -  person Steve Rosenberg    schedule 05.10.2014
comment
@SteveRosenberg, это весь код, который у меня есть. Я хочу, чтобы отображались имена, но я не хочу, чтобы они повторялись. Я хочу, чтобы все они были случайными, но ни один не повторялся.   -  person alex    schedule 05.10.2014
comment
О, вы страдаете от повторов просто потому, что случайная удача приводит к повторам?   -  person Steve Rosenberg    schedule 05.10.2014
comment
@TheCampingRusher «Все они случайны, но ни один не повторяется» - это оксюморон. Если вы можете делать прогнозы о предстоящих результатах на основе текущих результатов, это не случайно.   -  person Ideasthete    schedule 05.10.2014
comment
То, что вы ищете, - это случайное перемешивание, а не случайное число. На этот вопрос много раз ответили на SO.   -  person Rob Napier    schedule 05.10.2014
comment
Я бы взял копию вашего массива и удалял элементы по мере их выбора. Как это: let types = [Alex, Straub, Rusher, Graser] var unselected = types var selection = Int (arc4random_uniform (UInt32 (unselected.count))) var type = unselected [selection] unselected.removeAtIndex (selection) println (type ) selection = Int (arc4random_uniform (UInt32 (unselected.count))) type = unselected [selection] unselected.removeAtIndex (selection) println (type) Что вы делаете после того, как исчерпали список, зависит от вас.   -  person pbasdf    schedule 05.10.2014


Ответы (1)


Это позволяет избежать прямого повторения:

var lastIndex = -1
var index = -1

let types = ["Alex", "Straub", "Rusher", "Graser"]

do {
    index = Int(arc4random_uniform(UInt32(types.count)))
} while index == lastIndex

println(types[index])
lastIndex = index
person zisoft    schedule 05.10.2014
comment
Этот код генерирует один пару раз, он бы сказал: Alex Alex Alex Alex Alex, затем Straub Мне он нужен, чтобы он не повторялся, но все еще был несколько случайным - person alex; 05.10.2014