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

How to have 10 characters total and make sure at least one character from 4 different sets is used randomly

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

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

到目前为止,我的想法是

let roomIDGenerated = uniqueRoomID.text

let roomIDCount = roomIDGenerated?.characters.count

let randomCharacterSet = arc4random() upp

   while roomIDCount < 10 {
        <#code#>
    }

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

总的来说我有点卡住了,如有任何帮助,我们将不胜感激

Martin 的评论与我采用的方法相同。这是我的实现:

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 
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([=10=].characters) }
let size = 10

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