2017-05-06 7 views
-3

Ich möchte die Funktion zufällige Zeichenfolge generieren, ohne zu wiederholen. Zum Beispiel wird diese Funktion vielleicht drucken: ABCCGenerieren einer zufälligen Zeichenfolge ohne in swift zu wiederholen

func randomString(length:Int) -> String { 
let charSet = "ABCDEF" 
var c = charSet.characters.map { String($0) } 
var s:String = "" 
for _ in (1...length) { 
    s.append(c[Int(arc4random()) % c.count]) 
} 
return s 
} print(randomString(length: 4)) 

und i zufällige eindeutige Zeichenfolge drucken möchten nur, zum Beispiel: ABCD

+0

Schon mal ein Kartenspiel spielen? Haben Sie schon einmal von dem Begriff "Shuffle" gehört? Mische die Charaktere und erledige die ersten vier. – matt

+1

http://stackoverflow.com/questions/27761557/shuffling-a-string-in-swift (von denen Ihre Frage wirklich nur ein Duplikat ist) – matt

+0

oder dieses: http://stackoverflow.com/questions/26845307/ generate-random-alphanumeric-string-in-swift – iWheelBuy

Antwort

0
func randomString(length: Int) -> String { 
    let charSet = "ABCDEF" 
    var charSetArray = charSet.characters.map { String($0) } 
    var randArray: [String] = [] 
    while charSetArray.count > 0 { 
     let i = Int(arc4random_uniform(UInt32(charSetArray.count))) 
     randArray.append(charSetArray[i]) 
     charSetArray.remove(at: i) 
    } 
    var output: String = "" 
    for i in 0..<length { 
     output.append(randArray[i]) 
    } 
    return output 
} 
1
import GameplayKit 

func randomString(length : Int) -> String { 
    let charSet = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters) 
    let shuffled = GKRandomSource.sharedRandom().arrayByShufflingObjects(in: charSet) as! [Character] 
    let array = shuffled.prefix(length) 
    return String(array) 
} 

print(randomString(length: 4)) 
+0

Doppelte Zeichen sind mit Ihrer Antwort möglich – iWheelBuy

+0

In welcher Weise? Die Zeichenmenge wird gemischt. Keine von ihnen sind doppelt vorhanden. Die ersten "Längen" -Einträge werden von der Vorderseite der gemischten Anordnung genommen. Wo könnten die Charaktere im Set dupliziert werden? –

+0

Array ("ABCA" .characters) – iWheelBuy

0

Wie zu verwenden:

let randomString = "ABCDEF".random(length: 3)! 

Der Rückgabewert ist optional, da die Länge die Länge der angegebenen Zeichenfolge überschreiten kann.

Überprüfen Sie die vollständige Umsetzung aus:

import UIKit 
import PlaygroundSupport 

extension MutableCollection where Indices.Iterator.Element == Index { 
    mutating func shuffle() { 
     let c = count 
     guard c > 1 else { return } 
     for (firstUnshuffled , unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) { 
      let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount))) 
      guard d != 0 else { continue } 
      let i = index(firstUnshuffled, offsetBy: d) 
      swap(&self[firstUnshuffled], &self[i]) 
     } 
    } 
} 

extension Sequence { 
    func shuffled() -> [Iterator.Element] { 
     var result = Array(self) 
     result.shuffle() 
     return result 
    } 
} 

extension String { 

    func random(length: Int) -> String? { 
     let uniqueCharacters = Array(Set(characters.map({ String($0) }))) 
     guard length <= uniqueCharacters.count else { return nil } 
     guard length > 0 else { return nil } 
     return uniqueCharacters[0..<length].shuffled().joined() 
    } 
} 
Verwandte Themen