生成一个非重复随机数的Swift数组

时间:2015-01-27 17:13:13

标签: ios arrays swift random

我想在Swift中生成多个不同的随机数。这是程序。

  1. 设置空数组
  2. 生成随机数
  3. 检查阵列是否为空 一个。如果数组为空,请插入随机数
    湾如果数组不为空,则将随机数与数组中的数字进行比较  一世。如果数字相同,则重复2
     II。如果数字不相同,请插入随机数并重复2

    import UIKit 
    
    //the random number generator
    func randomInt(min: Int, max:Int) -> Int {
        return min + Int(arc4random_uniform(UInt32(max - min + 1)))
    }
    
    var temp = [Int]()
    for var i = 0; i<4; i++ {
      var randomNumber = randomInt(1, 5)
      if temp.isEmpty{
        temp.append(randomNumber)
      } else {
      //I don't know how to continue...
     }
    }
    

3 个答案:

答案 0 :(得分:5)

如果你使用你的方法问题是,你每次都会创建一个新的随机数。所以你可能有4次相同的随机数,所以你的数组只有一个元素。

所以,如果你只是想在一个特定的数字范围内(例如0-100)拥有一个数字数组,那么你可以用随机的顺序填充一个带有数字的数组&#39; normal&# 39;订购。例如,使用for循环等:

var min = 1
var max = 5
for var i = min; i<= max; i++ {
    temp.append(i)
}

之后,您可以使用shuffle方法使用this answer中的shuffle方法对数组的所有元素进行混洗:

func shuffle<C: MutableCollectionType where C.Index == Int>(var list: C) -> C {
    let count = countElements(list)
    for i in 0..<(count - 1) {
        let j = Int(arc4random_uniform(UInt32(count - i))) + i
        swap(&list[i], &list[j])
    }
    return list
}

Ater,你可以这样做:

shuffle(temp)        // e.g., [3, 1, 2, 4, 5]

答案 1 :(得分:1)

您正在寻找的方法可能类似于:

var temp: [Int] = []
while temp.count < 4 {
    var randomNumber: Int
    do {
        randomNumber = randomInt(1, 5)
    } while contains(temp, randomNumber)
    temp.append(randomNumber)
}

这对于像你这样的小范围来说会很好,但是对于较大的范围来说它会非常慢,因为对于最后几个数字,你正在等待随机数精确地击中剩下的一些可能性。我只是尝试在操场上生成200个射程,花了9秒钟。

如果你想随机选择一个范围内保证覆盖率的数字,你可以通过获取该范围并将其改组来生成它,如下所示:

func shuffle<S: SequenceType>(source: S) -> [S.Generator.Element] {
    var rangen = GeneratorOf { arc4random() }
    let a = Array(Zip2(rangen, source))
    return a.sorted { $0.0 < $1.0 }.map { $0.1 }
}

let min = 1, max = 5
shuffle(min...max)

如果你想要从范围0..<m中选择n个非重复随机数,那么有一个特别漂亮的算法可以从这个范围内生成一个递增的随机数序列:

func randomGeneratorOf(#n: Int, #from: Int) -> GeneratorOf<Int> {

    var select = UInt32(n)
    var remaining = UInt32(from)
    var i = 0

    return GeneratorOf {
        while i < from {
            if arc4random_uniform(remaining) < select {
                --select
                --remaining
                return i++
            }
            else {
                --remaining
                ++i
            }
        }
        return nil
    }
}

您可以这样使用:

let engines = [
    "Duck","Emily","Gordon","Henry", "Mavis",
    "Belle","James","Edward","Thomas","Toby"
]

let picks = Array(randomGeneratorOf(n: 3, from: engines.count))

for engine in PermutationGenerator(elements: engines, indices: picks) {
    println(engine)
}

答案 2 :(得分:1)

以下是我的建议。 我喜欢这种方式,因为它简短而简单:)

let totalCount: Int = 150 //Any number you asssign
var randomNumArray: [Int] = []
var i = 0
while randomNumArray.count < totalCount {
    i++
    let rand = Int(arc4random_uniform(UInt32(totalCount)))
    for(var ii = 0; ii < totalCount; ii++){
        if randomNumArray.contains(rand){
            print("do nothing")
        } else {
            randomNumArray.append(rand)
        }
    }
}