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

Swift2 随机数生成器-arc4Random-数字不能相同,swift2,arc4random,ios8.4,xcode6.4,Swift2,Arc4random,Ios8.4,Xcode6.4,我有一个随机数生成器,使用arc4Random和三个数字的整数,number1,number2,number3,范围为1-3。零是不允许的。由于之前的请求,我在这里对该部分进行了排序,但是,当按下测试按钮时,我希望确保随机数不相同,即如果数字1显示2,则数字2和数字3不能显示2等。 我试着在下面做这件事,但一定有更简单的方法。 在我学习Xcode才6周的时候,这是如何用代码编写的? 当做 德尔辛兹 @IBAction func testButtonPressed(sender: UIButton

我有一个随机数生成器,使用arc4Random和三个数字的整数,number1,number2,number3,范围为1-3。零是不允许的。由于之前的请求,我在这里对该部分进行了排序,但是,当按下测试按钮时,我希望确保随机数不相同,即如果数字1显示2,则数字2和数字3不能显示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-Yates洗牌。

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


如果你需要改组有一个给定的数字出现在它尚未发生的条件下的概率,则剩下1个/数,然后采用更严格的Fisher Yates洗牌。

< P>如果你使用IOS9的游戏玩法,考虑GkSuffFeldDead。 游乐场示例:

  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 123 132 231 132 123

或考虑GK随心所欲:< /P> 样本结果: [甲,丙,乙] [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: "" ) }
  }
资源使用修订

将AnyObject替换为Any 现在使用arrayByShufflingObjectsin:blocks 给予


如果你使用IOS9的游戏玩法,考虑GKSuffFeldDead。 游乐场示例:

  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 123 132 231 132 123

或考虑GK随心所欲:< /P> 样本结果: [甲,丙,乙] [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: "" ) }
  }
资源使用修订

将AnyObject替换为Any 现在使用arrayByShufflingObjectsin:blocks 给予


如果你只是在1-3范围内生成,并且不能重复,只需制作一个数组[1,2,3],洗牌它,然后弹出即时非重复随机值。嗨,马克,谢谢你的回答。虽然我不确定我是否理解答案,但我会努力的。很多人都喜欢。Delif你只是在1-3范围内生成,不能有重复,只需要做一个数组[1,2,3],洗牌,然后弹出即时不重复的随机值。嗨,马克,谢谢你的回答。虽然我不确定我是否理解答案,但我会努力的。很多人都喜欢。德里芭丝谢芭,谢谢你的回答。虽然我不确定我是否理解答案,但我会努力的。很多人都喜欢。德里芭丝谢芭,谢谢你的回答。虽然我不确定我是否理解答案,但我会努力的。很多人都喜欢。德里·芬内卢斯基,谢谢你的回答。我不知道我是否了解
尽管我明白答案,但我会努力的。很多人都喜欢。德里·芬内卢斯基,谢谢你的回答。虽然我不确定我是否理解答案,但我会努力的。很多人都喜欢。德里重构,谢谢你的回复。这些都是有趣的选项,感谢您的编码。我会调查的。又是唐克斯。德里重构,谢谢你的回复。这些都是有趣的选项,感谢您的编码。我会调查的。又是唐克斯。德尔