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

时间:2015-07-29 14:23:16

标签: swift2 arc4random ios8.4 xcode6.4

我有一个使用arc4Random的随机数生成器和带有三个数字的整数,number1,number2,number3,范围是1-3。不允许为零。由于此处的先前请求,我已经对该部分进行了排序,但是,当按下测试按钮时,我想确保随机数不相同,即如果number1显示2,则number2和number3不能显示2等。 我尝试在下面做这个手写,但必须有一个更简单的方法。 如何在代码中编写,因为我只学习了Xcode大约6周? 问候。 Del Hinds

@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)"

3 个答案:

答案 0 :(得分:3)

这样做的一个粗略方法是从你的情况下可能的数字集{1,2,3}的数组开始,并使用内置随机生成器交换数组中的随机元素几次

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

答案 1 :(得分:3)

如果您使用的是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]

斯威夫特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 用法修订

  • 用Any替换AnyObject
  • 现在使用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)
   }

答案 2 :(得分:0)

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

分配号码后,将其添加到阵列中。检查数组大小是否大于或等于允许数字的范围。如果随机数的数量已用尽,则抛出错误并且不允许随机分配更多数字。

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

如果您为一小组数字执行此操作,那么最好将范围中的数字添加到数组中,并在分配数组时将其从数组中删除。