打印功能结果为阵列

时间:2015-08-26 14:29:25

标签: arrays swift random

似乎很简单,但我无法理解。

let getRandom = randomSequenceGenerator(min: 1, max: 20)
for _ in 1...20 {
    println(getRandom())
}

getRandom在控制台中输出20个非重复数字......完美。

我希望将这20个非重复数字放入数组中,以便我可以使用它们。 我似乎无法弄明白。

或者无论如何我可以访问控制台以外的那20个号码。

4 个答案:

答案 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)