如何总共有 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", "%"]
我有一个文本字段和一个生成一组随机字符的按钮。设置 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", "%"]