1

我有一个随机数生成器,它使用 arc4Random 和具有三个数字的整数,number1、number2、number3,范围为 1 - 3。不允许使用零。由于之前的请求,我已经对这里进行了排序,但是,当按下测试按钮时,我想确保随机数不一样,即如果 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)"
4

3 回答 3

3

一种粗略的方法是从您的情况下可能的数字集 {1, 2, 3} 的数组开始,然后使用内置的随机生成器交换数组中的随机元素几次。

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

于 2015-07-29T14:32:46.470 回答
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使用修订

  • 将 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)
   }
于 2015-07-29T21:33:40.610 回答
0

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

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

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

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

于 2015-07-29T14:29:46.543 回答