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

我对Swift非常陌生,一般编程逻辑对我来说也是如此

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

将先前生成的号码存储在一个variables中,并将生成的号码与前一个号码进行比较。 如果他们匹配产生一个新的随机数。 重复新号码的生成,直到他们不匹配。

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 } 

我的解决scheme,我觉得很容易理解

 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) } 

这里有一个很好的诀窍,可以从以前select的数字中平等地select。

你有10个号码,但你只想从9个号码(0到9,但不包括以前的号码)中select。 如果您将范围减less1,则可以从9个随机数中进行select,然后使用范围的前一个数字replace重复的数字。 这样,每次只需要生成一个随机数就可以得到一致性:

 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 } 

最简单的方法是重复/ while:

 let current = ... var next: Int repeat { next = Int(arc4random_uniform(9)) } while current == next // Use `next` 

把所有你想要的值放到一个数组中,使用arc4random_uniform(SIZEOFARRAY)生成一个随机数,并从数组中取出随机数的索引,然后重复这个过程直到数组为空。