如何总共10个字符,并确保随机使用4个不同集合中的至少一个字符

时间:2016-04-29 06:54:00

标签: swift swift2 arc4random

我有一个文本字段和一个生成随机字符集的按钮。设置1 =小写,设置2 =大写,设置3 =数字,设置4 =符号

我希望按钮不再生成不少于10个字符,并且每个集合至少拉一次。

到目前为止,我对如何做到这一点的想法是

let roomIDGenerated = uniqueRoomID.text

let roomIDCount = roomIDGenerated?.characters.count

let randomCharacterSet = arc4random() upp

   while roomIDCount < 10 {
        <#code#>
    }

但是我不知道该怎么做...我并不总是希望前4个字符始终是每个字符中的一个......可能最后使用了一个必需的字符。

我总体上被困住了,任何帮助都会受到赞赏

1 个答案:

答案 0 :(得分: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", "%"]