2016-04-29 16 views
1

我有一個文本字段和一個按鈕,可以生成一組隨機字符。設置1 =小寫,設置2 =大寫,設置3 =數字,設置4 =符號如何共有10個字符,並確保從4個不同的集合中至少有一個字符被隨機使用

我希望按鈕生成不少於10個字符並且每個集合至少拉一次。

我如何做到這一點的想法至今

let roomIDGenerated = uniqueRoomID.text 

let roomIDCount = roomIDGenerated?.characters.count 

let randomCharacterSet = arc4random() upp 

    while roomIDCount < 10 { 
     <#code#> 
    } 

但我不明白怎麼做了......我並不總是想要的前4個字符永遠是每一個..也許最後使用一個必需的集合。

我有點停留在一般情況下,任何幫助,將不勝感激

+0

我喜歡在最終字符串的位置創建arc4random思考...但我不知道是否就是正確的或如何做到這一點 – RubberDucky4444

+1

選擇從每組一個隨機字符 - 用隨機字符填充所有組 - 隨機播放。 –

+0

那就是輝煌! – RubberDucky4444

回答

1

馬丁,我走的是同樣的方法評價。下面是我的實現:

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", "%"] 
相關問題