2016-05-09 18 views
0

Ich erstelle zufällig für verschiedene Arrays mit 4 zufälligen Zahlen (1-4). Aber wie stelle ich sicher, dass keine zwei Arrays gleich sind? Beispiel: [1,2,3,4], [4,3,2,1], [1,2,2,1], [1,2,3,4] < - zuerst und zuletzt wurden die gleichen zufällig generiert, wie kann ich überprüfen, ob es zufällig ist und wenn es wieder generiert wird, und wenn es nicht ist, weiter?Swift: Stellen Sie sicher, dass keine zwei Arrays gleich sind

Dies ist mein Code, aber ich glaube nicht, dass es funktioniert, weil ein paar Mal habe ich zwei gleiche Arrays sehen werden ...

func randomNumbersArray(i: UInt32) -> [Int] { 
    let r = [Int(arc4random_uniform(i) + 1), 
      Int(arc4random_uniform(i) + 1), 
      Int(arc4random_uniform(i) + 1), 
      Int(arc4random_uniform(i) + 1)] 
    return r 
} 

func arrays() { 
    let main = randomNumbersArray(4) 
    qArray = main 
    aArray = main 
    bArray = randomNumbersArray(4) 
    cArray = randomNumbersArray(4) 
    dArray = randomNumbersArray(4) 

    if aArray == bArray || aArray == cArray || aArray == dArray || 
     bArray == cArray || bArray == dArray || cArray == dArray { 
     bArray = randomNumbersArray(4) 
     cArray = randomNumbersArray(4) 
     dArray = randomNumbersArray(4) 
    } 
    print(aArray) 
    print(bArray) 
    print(cArray) 
    print(dArray) 
} 
+2

Wenn die Dinge zufällig sind, könnten sie wiederholen - das ist normal, zufälliges Verhalten. Außerdem gibt es nicht viele eindeutige Arrays mit 1-4 in ihnen. Was passiert, wenn Sie ausgehen? –

+1

@LouFranco Nun, es gibt 256 von ihnen, das ist nicht so schlecht, wenn Sie nur 4 benötigen. Technisch könnten Sie nur 4 Zahlen im 0..255 Bereich generieren und die Arrays aus diesen Zahlen generieren (jede zwei Bits stellen eine Ziffer dar) . Es wäre auch völlig möglich, alle Arrays vorgenerieren und dann von ihnen zufällig auswählen. – Sulthan

Antwort

1

So etwas sollte es tun:

func randomNumbersArray(i: UInt32) -> [Int] { 
    let r = [Int(arc4random_uniform(i) + 1), 
      Int(arc4random_uniform(i) + 1), 
      Int(arc4random_uniform(i) + 1), 
      Int(arc4random_uniform(i) + 1)] 
    return r 
} 

func arrays() { 
    var randArrays = [[Int]]() 

    repeat { 
     let newArray = randomNumbersArray(4) 

     if !randArrays.contains{ $0 == newArray } { 
      randArrays.append(newArray) 
     } 
    } while randArrays.count < 4 

    //... 
} 
+2

Um es klar zu sagen: Dies wird eine zunehmend schlechtere Leistung haben, da die Werte von "i" abnehmen und sogar unendlich wiederholt werden, wenn Sie versuchen, mehr eindeutige Arrays als für den gegebenen Wert von "i" möglich zu machen. – Alexander

+0

Mit ein wenig Anpassung funktionierte das perfekt. Vielen Dank ! –

+0

Wenn Sie die Größe von 'Array' im Voraus kennen, ist es am besten, die [' init (count: repeatedValue:) '] (https://developer.apple.com/library/ios/documentation/) zu verwenden. Swift/Reference/Swift_Array_Structure/index.html # // apple_ref/swift/structctr/Array: FSacFT5countSi13repeatedValuex_GSax_) Initialisierer zum Vorabzuweisen der Größe. Es ist hier nicht so wichtig (mit einer Größe von nur 4), aber es ist eine gute Übung für größere Arrays. – Alexander

0

abgeben Array Ihre Arrays zu speichern. Wenn Sie ein neues Array erstellen, überprüfen Sie .contains(_:), und generieren Sie neue Arrays, bis es false ist.

Verwandte Themen