2014-09-24 6 views
0

Я пытаюсь создать случайные цвета фона для отображения пользователю, когда они нажимают кнопку на экране. У меня есть неизменный массив элементов UIColor, и я создал изменчивую копию для управления. Когда генерируется случайный цвет, этот цвет затем возвращается и удаляется из изменяемой копии массива, чтобы предотвратить последовательные показы одного цвета, пока не будут показаны все цвета. Предполагается, что это произойдет до тех пор, пока счетчик массива не будет равен 0, а затем он воссоздает массив для повторения процесса. Однако, когда я добираюсь до массива, имеющего от 2 до 0 элементов, цикл, кажется, превращается в бесконечный цикл. Какую логику мне не хватает в моем коде (файл детской площадки)?Проблемы со случайными номерами в Swift

var currentColorIndexNumber = 0 
var newColorIndexNumber = 0 

let colorsArray = [ 
    UIColor(red: 90/255.0, green: 187/255.0, blue: 181/255.0, alpha: 1.0), //teal color 
    UIColor(red: 222/255.0, green: 171/255.0, blue: 66/255.0, alpha: 1.0), //yellow color 
    UIColor(red: 223/255.0, green: 86/255.0, blue: 94/255.0, alpha: 1.0), //red color 
    UIColor(red: 239/255.0, green: 130/255.0, blue: 100/255.0, alpha: 1.0), //orange color 
    UIColor(red: 77/255.0, green: 75/255.0, blue: 82/255.0, alpha: 1.0), //dark color 
    UIColor(red: 105/255.0, green: 94/255.0, blue: 133/255.0, alpha: 1.0), //purple color 
    UIColor(red: 85/255.0, green: 176/255.0, blue: 112/255.0, alpha: 1.0), //green color 
] 

var mutableColorsArray: [AnyObject] = colorsArray 

func randomNumber() -> Int { 
    // avoid repeating random integers 
    while currentColorIndexNumber == newColorIndexNumber { 
     var unsignedArrayCount = UInt32(mutableColorsArray.count) 
     var unsignedRandomNumber = arc4random_uniform(unsignedArrayCount) 
     newColorIndexNumber = Int(unsignedRandomNumber) 
    } 
    currentColorIndexNumber = newColorIndexNumber 
    return newColorIndexNumber 
} 

func randomColor() -> UIColor { 
    var randomIndex = randomNumber() 
    var randomColor = mutableColorsArray[randomIndex] as UIColor 
    mutableColorsArray.removeAtIndex(randomIndex) 
    if mutableColorsArray.count == 0 { 
     mutableColorsArray = colorsArray 
    } 
    return randomColor 
} 

ответ

0

Попробуйте вместо этого перетасовать. Что-то вдоль этих линий:

var colorsArray = ["red","green","blue","yellow","purple"] 
var currentColorIndexNumber = colorsArray.count 

func shuffle<T>(inout array: Array<T>) -> Void { 
    for index in 0..<colorsArray.count { 
    let swapLocation = index + Int(arc4random_uniform(UInt32(colorsArray.count - index))) 
    if index != swapLocation { 
     swap(&array[swapLocation], &array[index]) 
    } 
    } 
} 

func randomColor() -> String { 
    // shuffle first time through, then every time the list is exhausted 
    if currentColorIndexNumber >= colorsArray.count - 1 { 
    // shuffle, but guarantee first color after shuffling 
    // is not the same as last color from previous round 
    do { 
     shuffle(&colorsArray) 
    } while colorsArray[0] == lastColor 
    currentColorIndexNumber = -1 
    lastColor = colorsArray[colorsArray.count-1] 
    } 
    currentColorIndexNumber += 1 
    return colorsArray[currentColorIndexNumber] 
} 

for i in (5*colorsArray.count) { 
    print("\(randomColor()) ") 
    if i % colorsArray.count == 0 { 
    println() 
    } 
} 
0

У меня были хорошие результаты с

func randomObject(array: [AnyObject]) -> AnyObject { 
    return array[Int(arc4random_uniform(UInt32(array.count)))] 
} 

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

func shuffleArray<T>(array: Array<T>) -> Array<T> { 
    for var i = array.count - 1; i > 0; i-- { 
    var j = Int(arc4random_uniform(UInt32(i-1))) 
    swap(&array[i], &array[j]) 
    } 
    return array 
} 
+0

Это не будет перечислять все цвета без повторения, которые я читал как намерение bnkohrn. – pjs

+0

Правда, я пропустил это требование. – Mundi

Смежные вопросы