如何在Swift中生成随机数而不重复先前的随机数?

时间:2014-12-18 07:19:44

标签: swift

我对Swift和编程逻辑都很陌生,所以请耐心等待

如何在Swift中生成0到9之间的随机数,而不重复上一次生成的数字?因为同样的数字不会连续两次出现。

6 个答案:

答案 0 :(得分:17)

我的解决方案,我认为它易于理解

var nums = [0,1,2,3,4,5,6,7,8,9]

while nums.count > 0 {

    // random key from array
    let arrayKey = Int(arc4random_uniform(UInt32(nums.count)))

    // your random number
    let randNum = nums[arrayKey] 

    // make sure the number isnt repeated
    nums.removeAtIndex(arrayKey)
}

答案 1 :(得分:11)

将先前生成的数字存储在变量中,并将生成的数字与之前的数字进行比较。如果匹配则生成新的随机数。重复生成新数字直到它们不匹配。

var previousNumber: UInt32? // used in randomNumber() 

func randomNumber() -> UInt32 {
    var randomNumber = arc4random_uniform(10)
    while previousNumber == randomNumber {
        randomNumber = arc4random_uniform(10)
    }
    previousNumber = randomNumber
    return randomNumber
}

答案 2 :(得分:4)

这是一个很好的技巧,可以从之前选择的数字中同等地选择。

您有10个号码,但您只想从9个号码中选择(0到9,但不包括前一个号码)。 如果将范围缩小1,则可以从9个随机数中选择,然后将重复的数字替换为范围的前一个最大数字。通过这种方式,您每次只需生成一个随机数,就可以获得一致性:

var previousNumber = arc4random_uniform(10)   // seed the previous number

func randomNumber() -> UInt32 {
    var randomNumber = arc4random_uniform(9)  // generate 0...8
    if randomNumber == previousNumber {
        randomNumber = 9
    }
    previousNumber = randomNumber
    return randomNumber
}

答案 3 :(得分:2)

最简单的方法是使用repeat / while:

let current = ...
var next: Int

repeat {
    next = Int(arc4random_uniform(9))
} while current == next

// Use `next`

答案 4 :(得分:0)

将所需的所有值放入数组中,使用arc4random_uniform(SIZEOFARRAY)生成随机数,并从数组中提取随机值的索引,然后重复此过程直到数组为空。

答案 5 :(得分:0)

这是一种直观的方法:记住以前“选择”随机元素的索引,并在下次“选择”随机元素时暂时消除该索引的元素。

对Array进行一些扩展将很有用:

extension Array {
    func without(_ ix:Int) -> Array<Element> {
        var arr = self; arr.remove(at:ix); return arr
    }
}

好的,我们开始:

let pep = ["Manny", "Moe", "Jack"]
let ixs = Array(pep.indices)
var prev = ixs.randomElement()!
for _ in 1...20 {
    print(pep[prev])
    prev = ixs.without(prev).randomElement()!
}

典型运行结果:

Manny
Moe
Manny
Jack
Manny
Moe
Manny
Moe
Jack
Moe
Jack
Moe
Manny
Jack
Manny
Moe
Jack
Manny
Moe
Jack

如您所见,它们看起来很随意,但是没有立即重复。