【问题标题】:Random Number Generator - arc4Random - Numbers can not be same随机数生成器 - arc4Random - 数字不能相同
【发布时间】:2015-07-29 14:23:16
【问题描述】:

我有一个随机数生成器,它使用 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)"

【问题讨论】:

  • 如果您只是在 1-3 范围内生成并且不能重复,只需创建一个数组 [1,2,3],将其随机播放,然后繁荣 - 即时非重复“随机”值。
  • 嗨,马克,感谢您的回答。虽然不确定我是否理解答案,但我会努力解决的。多谢。德尔

标签: swift2 arc4random ios8.4 xcode6.4


【解决方案1】:

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

【讨论】:

  • 您好重构,感谢您的回复。这些是有趣的选择,感谢您的编码。我会调查他们。再次感谢。德尔
【解决方案2】:

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

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

【讨论】:

  • 嗨,芭丝谢巴,感谢您的回答。虽然不确定我是否理解答案,但我会努力解决的。多谢。德尔
【解决方案3】:

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

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

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

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

【讨论】:

  • 您好 Fennelouski,感谢您的回答。虽然不确定我是否理解答案,但我会努力解决的。多谢。德尔
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多