【问题标题】:Creating random number in SpriteKit在 SpriteKit 中创建随机数
【发布时间】:2016-10-07 22:14:21
【问题描述】:

我正在尝试创建一个以随机角度发射弹丸的游戏。 为此,我需要能够生成两个随机 Int。我查阅了一些教程并想出了这个:

var random = CGFloat(Int(arc4random()) % 1500)
var random2 = CGFloat(Int(arc4random()) % -300)
self.addChild(bullet)
bullet.physicsBody!.velocity = CGVectorMake((random2), (random))

它工作了一段时间,但现在它崩溃了。

任何帮助将不胜感激。

【问题讨论】:

  • 如果它崩溃了,您可能还有更多信息要分享。它在哪里崩溃,堆栈跟踪到底说了什么?它可能直接与随机数的创建有关,而是其他的。 (例如,缺少physicsBody 的Bullet,或者已经有父级的Bullet)。
  • 认为这个问题更多的是关于获取随机值而不是关于崩溃,nickfalk 可能是正确的,崩溃无论如何都是无关的。
  • 肯定是随机数,我换成普通的 Ints 并没有崩溃。
  • 那么我会怀疑带有负数的模是一个问题,但是代码中的某些东西“工作一段时间”然后如果没有其他任何变化就开始崩溃是非常不寻常的。

标签: swift random sprite-kit int


【解决方案1】:

我发现我使用最多的是arc4random_uniform(upperBound),它返回一个随机的 Int,范围从零到上界 -1。

let random = arc4random_uniform(1500)
let random2 = arc4random_uniform(300) * -1

//pick a number between 1 and 10
let pick = arc4random_uniform(10)+1

arc4 函数的内幕:arc4random man page

GameplayKit 有一个很好的类来包装 arc4 函数:GameplayKit Randomness

还有一个方便的参考:Random Hipster

【讨论】:

  • 您还应该提到不要对 arc4random 使用模运算。它创建不相等(即非随机)的数字分布。无论如何:-)很好的答案。
  • arc4random() 的分布不相等,所以并不是数字不是随机的,而是某些值会更频繁地出现。 arc4_uniform() 在其范围内提供均等分布,并且无需进行模计算。
  • 对不起,我的错,忘记了arc4random_uniform(n) 中的random。编辑答案。
  • 好的,现在开始测试。顺便说一句,你回复得很快。
【解决方案2】:

我不太了解您的问题,但我认为它可能有用:

func getRandomPointFromCircle(radius:Float, center:CGPoint) -> CGPoint {
     let randomAngle = Float(arc4random())/Float(UInt32.max-1) * Float(M_PI) * 2.0
     // polar => cartesian
     let x = radius * cosf(theta)
     let y = radius * sinf(theta)
     return CGPointMake(CGFloat(x)+center.x,CGFloat(y)+center.y)
}

【讨论】:

  • arc4random 已经在 UInt32.max 范围内,所以不需要统一
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
相关资源
最近更新 更多