随机数生成器 - arc4Random - 数字不能相同

Random Number Generator - arc4Random - Numbers can not be same

我有一个随机数生成器,它使用 arc4Random 和包含 1 - 3 范围内的三个数字 number1、number2、number3 的整数。不允许为零。由于之前在这里的请求,我已经对那部分进行了排序,但是,当按下测试按钮时,我想确保随机数不相同,即如果 number1 显示 2,则 number2 和 number3 不能显示 2 等。 我试着在下面用手写,但一定有更简单的方法。 由于我只学习了 Xcode 大约 6 周,这将如何用代码编写? 问候。 德尔欣兹

@IBAction func testButtonPressed(sender: UIButton) {

var str = "Hello, playground"

var number1 = Int(arc4random() % UInt32(4))

if number1 == 0 {
number1 = 1
}

var number2 = Int(arc4random() % UInt32(4))

if number2 == 0 {
if number1 == 1 {
    number2 = 2
}
else if number1 == 2 {
    number2 = 3
}
else if number1 == 3 {
    number2 = 1
}
number2 = 1
}

label2TextLabel.text = "\(number2)"

var number3 = Int(arc4random() % UInt32(4))

if number3 == 0 {
if number2 == 1 {
    number3 = 2
}
else if number2 == 2 {
    number3 = 3
}
else if number2 == 3 {
    number3 = 1
}
number3 = 1
}

label3TextLabel.text = "\(number3)"

创建一组(或一组)分配的数字。分配新数字时,请检查该数字是否已在数组中。如果是,则分配一个新的随机数。重复。

分配数字后,将其添加到数组中。检查数组大小是否大于或等于允许的数字范围。如果随机数用完则抛出错误,不允许再随机分配更多的数。

如果您对大量数字执行此操作,则应检查以确保所用数字数组的大小不大于可分配数字范围大小的一半左右。

如果您对一小组数字执行此操作,那么最好将范围内的数字添加到数组中,然后在分配时将它们从数组中删除。

一个粗略的方法是从你的情况下可能的数字集 {1, 2, 3} 的数组开始,然后使用内置的随机生成器。

但是,如果您要求改组具有统计 属性 给定数字发生的条件是尚未发生的概率为 1 /(剩余数字),则采用更严格的 Fisher-耶茨洗牌。

如果您正在使用 ios9 的 GameplayKit,请考虑 GKShuffledDistribution
游乐场示例:

  import GameplayKit
  let distribution = GKShuffledDistribution(lowestValue: 1, highestValue: 3)
  for i in 1...36 {  // Do 12 groups of 3
      print(distribution.nextInt(), appendnewline: false)
      if i % 3 == 0 { print(" ", appendnewline: false ) }
   }

示例结果: 213 132 321 312 213 132 132 123 132 231 132 123


或者考虑GKRandomSource:

  import GameplayKit
  blocks : [AnyObject] = ["A","B","C"]
  for  _ in  1...5 {  // do 5 shuffles
     blocks = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(blocks)
     print(blocks)
   }

示例结果: [A, C, B] [B, C, A] [B, A, C] [C, A, B] [B, A, C]

Swift 3:

GKShuffledDistribution - 没有实际变化,修改了打印用法。

  import GameplayKit
  let distribution = GKShuffledDistribution(lowestValue: 1, highestValue: 3)
  for i in 1...36 {
      print(distribution.nextInt(), terminator: "")
      if i % 3 == 0 { print(" ", terminator: "" ) }
  }

GKRandomSource 用法修改

  • 将 AnyObject 替换为 Any
  • 现在使用 arrayByShufflingObjects(in: blocks)

给予

  import GameplayKit
  blocks : [Any] = ["A","B","C"]
  for  _ in  1...5 {  // do 5 shuffles
     blocks = GKRandomSource.sharedRandom().arrayByShufflingObjects(in: blocks)
     print(blocks)
   }