2016-04-29 32 views
1

Ich habe ein Textfeld und eine Schaltfläche, die eine zufällige Menge von Zeichen generiert. Set 1 = Kleinbuchstaben, Set 2 = Großbuchstaben, Set 3 = Zahlen, Set 4 = SymboleWie 10 Zeichen insgesamt haben und sicherstellen, dass mindestens ein Zeichen aus 4 verschiedenen Sätzen zufällig verwendet wird

Ich möchte die Schaltfläche nicht mehr als mindestens 10 Zeichen und minimale Pull von jedem der Sätze mindestens einmal generieren.

Meine Vorstellung davon, wie es bisher zu tun ist,

let roomIDGenerated = uniqueRoomID.text 

let roomIDCount = roomIDGenerated?.characters.count 

let randomCharacterSet = arc4random() upp 

    while roomIDCount < 10 { 
     <#code#> 
    } 

Aber ich sehe nicht, wie es zu tun ... ich nicht immer die ersten 4 Zeichen will immer ein jeder sein .. vielleicht wird einer der benötigten Sätze zuletzt verwendet.

Ich bin irgendwie im Allgemeinen stecken, wäre jede Hilfe

+0

ich dachte, wie das Erstellen arc4random für die Position in dem eventuellen String ... aber ich weiß nicht, ob das ist richtig oder wie es zu tun – RubberDucky4444

+1

aus jedem Satz ein Zufallszeichen auswählen - füllen Sie mit zufälligen Zeichen aus allen Sets - shuffle. –

+0

das ist brilliant! – RubberDucky4444

Antwort

1

Martin mit dem gleichen Ansatz kommentiert geschätzt wird ich nahm. Hier ist meine Umsetzung:

extension CollectionType { 
    var random: Generator.Element { 
     guard !isEmpty else { fatalError("array cannot be empty") } 
     let array = Array(self) 
     return array[Int(arc4random_uniform(UInt32(array.count)))] 
    } 
} 

// from http://stackoverflow.com/a/24029847/1223781 
extension MutableCollectionType where Index == Int { 
    func shuffled() -> Self { 
     var copy = self 
     copy.shuffle() 
     return copy 
    } 

    mutating func shuffle() { 
     guard count >= 2 else { return } 

     for i in 0..<count - 1 { 
      let j = Int(arc4random_uniform(UInt32(count - i))) + i 
      guard i != j else { continue } 
      swap(&self[i], &self[j]) 
     } 
    } 
} 

let sets = ["abc", "ABC", "123", "#$%"].map { Array($0.characters) } 
let size = 10 

var randoms = sets.map { $0.random } 
while randoms.count < 10 { 
    randoms.append(sets.random.random) 
} 
print(randoms.shuffled()) // ["b", "b", "3", "c", "#", "%", "A", "#", "1", "%"]