似乎很简单,但我无法理解。
let getRandom = randomSequenceGenerator(min: 1, max: 20)
for _ in 1...20 {
println(getRandom())
}
getRandom在控制台中输出20个非重复数字......完美。
我希望将这20个非重复数字放入数组中,以便我可以使用它们。 我似乎无法弄明白。
或者无论如何我可以访问控制台以外的那20个号码。
答案 0 :(得分:0)
您只需使用数组和循环变量:
let getRandom = randomSequenceGenerator(min: 1, max: 20)
var array = [Int](20)
for i in 0 ..< 20 {
array[i] = getRandom()
}
答案 1 :(得分:0)
把它放入循环中:
func randomSequenceGenerator(min: Int, max: Int) -> Int {
return Int(arc4random_uniform(UInt32(max-min))+UInt32(min))
}
let getRandom = { randomSequenceGenerator(1, 20) }
var array = [Int]()
for _ in 1...20 {
array.append(getRandom())
}
答案 2 :(得分:0)
我想你只是想改变一些数字。我为Swift 2.0 beta 6做了这个:
func randomUpTo(n: Int) -> Int {
return Int(arc4random_uniform(UInt32(n)))
}
extension CollectionType {
func shuffled() -> [Generator.Element] {
var ind = Array(indices)
return (startIndex..<endIndex).map{_ in self[ind.removeAtIndex(randomUpTo(ind.count))] }
}
}
你可以这样使用:
(1...100).shuffled() // [9, 8, 1, 19, 17, 2, 13, 16, 11, 12, 7, 14, 20, 3, 15, 6, 18, 4, 10, 5]
let alphabet = (1...26).map{ Character(UnicodeScalar($0 + 64)) } // ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
alphabet.shuffled() // ["V", "I", "S", "R", "H", "L", "F", "U", "T", "A", "X", "W", "B", "P", "K", "M", "Y", "E", "N", "Z", "G", "J", "Q", "D", "C", "O"]
编辑:上面的算法与此算法一样快(复杂度为O(n ^ 2))(Fisher-Yikes算法):
extension CollectionType {
func chooseRandom(n : Int = Int.max) -> [Generator.Element] {
var values = Array(self)
for index in values.indices.dropFirst().reverse().prefix(n) {
swap(&values[randomUpTo(index)], &values[index])
}
return Array(values.suffix(n))
}
}
你可以像这样使用它:
(0...20).chooseRandom(10) // [20, 8, 7, 12, 3, 10, 19, 2, 15, 16]
[1, 3, 5, 7, 9, 11].chooseRandom() // [11, 9, 3, 1, 7, 5]
适用于任何CollectionType
。复杂性是O(n)
答案 3 :(得分:0)
谢谢大家!这是我到达的解决方案,效果很好!这是3个随机生成的数字。显然,如果你想要更多只是更改数字....我使用了每个人的建议。谢谢你的帮助。
func randomSequenceGenerator(min min: Int, max: Int) -> () -> Int {
var numbers: [Int] = []
return {
if numbers.count == 0 {
numbers = Array(min ... max)
}
let index = Int(arc4random_uniform(UInt32(numbers.count)))
return numbers.removeAtIndex(index)
}
}
let getRandom = randomSequenceGenerator(min: 1, max: 3)
for i in 0...2 {
randomNonRepeat[i] = getRandom()
}
print (randomNonRepeat)