2016-04-29 6 views
1

ランダムな文字セットを生成するテキストフィールドとボタンがあります。セット1 =小文字、セット2 =大文字、セット3 =数字、セット4 =記号合計10文字を持つ方法と4つの異なるセットから少なくとも1文字がランダムに使用されることを確認してください

ボタンを10文字以上生成し、各セットから少なくとも1回は最小限にします。

これまでのところ、それを行う方法の私の考えは

let roomIDGenerated = uniqueRoomID.text 

let roomIDCount = roomIDGenerated?.characters.count 

let randomCharacterSet = arc4random() upp 

    while roomIDCount < 10 { 
     <#code#> 
    } 

あるしかし、私はそれを行う方法を見ていない...私は常に、常にそれぞれの一方であることを最初の4つの文字を望んでいませんおそらく、必要なセットの1つが最後に使用されます。私はちょっと一般にこだわって

、任意のヘルプは、マーティンは、私が取ったのと同じアプローチでコメントし

+0

私は、最終的な文字列内の位置のためのarc4randomの作成などを考えていた...しかし、それを行うにはthatsの権利や方法は各セットから1つのランダムな文字を選択してください – 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", "%"] 
関連する問題