【问题标题】:Understanding random numbers in iOS Swift 2理解 iOS Swift 2 中的随机数
【发布时间】:2016-01-20 03:43:54
【问题描述】:

如何让程序中的随机数随着时间的推移不断变化(即每次我想使用它时都在该范围内成为一个新的)?

我被难住了。我已经阅读了 20 多篇关于如何用这种语言生成随机数的不同帖子和文章(我对这门语言很陌生),但我似乎无法让它发挥作用。

我基本上是在尝试从 1.0-3.0 中获取随机双精度。我可以很容易地做到这一点,但是一旦它选择了那个数字,它就不会改变。这是我使用的代码:

var randomNumber:Double = (Double(arc4random() % 3) + 1);

然后我将其用作该行的值:

SKAction.waitForDuration(randomNumber)

每次运行时我都想再次更改数字,但是一旦程序启动它会继续使用相同的数字(每次重置程序时都不一样)

我知道如何生成号码,但我似乎找不到任何更新它的信息!

我已经尝试添加

randomNumber = (Double(arc4random() % 3) + 1);

将代码放入将运行多次的地方,但它仍然给我同样的东西。

我对 c++ 非常熟悉,所以如果你想解释一些东西,你可以参考它的风格,我很可能会理解。

【问题讨论】:

  • 记住randomNumber 是一个变量,而不是函数指针,所以当你说SKAction.waitForDuration(randomNumber) 时,你实际上是在说var randomNumber = 3; SKAction.waitForDuration(3)。你需要首先创建一个新的随机数,然后用这个新的随机数创建一个新的 waifForDuration,并将这个新的动作添加到精灵中

标签: ios swift random arc4random


【解决方案1】:

你需要的是一个只读的计算属性,每次你尝试访问它时都会返回一个新的随机数:

var randomNumber: Double {
    return Double(arc4random_uniform(3).successor())
}

print(randomNumber)  // 2.0
print(randomNumber)  // 2.0
print(randomNumber)  // 1.0
print(randomNumber)  // 3.0
print(randomNumber)  // 3.0

【讨论】:

  • 谢谢!!!这更有意义,唯一的问题是我认为我可能有一个更具体的问题。我正在使用runAction(SKAction.repeatActionForever( SKAction.sequence([ SKAction.runBlock(addMonster), SKAction.waitForDuration(randomNumber) ]),但是当我使用您的代码时,我仍然得到相同的号码。有什么想法吗?
  • 唯一的问题是我的方法也不起作用,因为返回的操作在他使用它的方式上是静态的
【解决方案2】:

用途:

SKAction.waitForDuration(sec: NSTimeInterval, withRange: NSTimeInterval) 

其中 sec 是您要使用的时间范围的中间值,因为范围是 +- 方向。

所以在你的情况下你想要:

SKAction.waitForDuration(2, withRange: 2),  this will get you a range of 1 to 3 (-1 to 1 range)

如果由于某种原因您需要一种不断创建新的随机等待的方法,您可以随时这样做:

extension SKAction
{
    func waitForRandomDuration() -> SKAction
    {
        var randomNumber:Double = (Double(arc4random() % 3) + 1);
        return SKAction.waitForDuration(randomNumber);

    }
}

然后确保每次需要完成时都将其作为新动作添加到精灵中,如果将其存储到变量中,则随机性不会改变。

【讨论】:

  • 这看起来很棒,但我如何将它嵌入到 SKAction 序列中?当我执行SKAction.waitForRandomDuration() 时,我收到错误消息:“在调用中缺少参数#1 的参数。”我必须输入哪些参数?
  • 我更新了你想要做什么的答案,我几乎忘记了 withRange 子句。我不知道为什么您在使用我的方法时会收到缺少参数的错误
  • 现在有了这个更新,我得到了错误"Extraneous argument label 'sec:' in call" 所以我试着省略它,它成功了!谢谢!!
  • 对了,第一个参数名忘记去掉了,不用了
  • 这不是整数等待,我希望没问题
【解决方案3】:

试试这个代码:

func randomNumberBetween1_0And3_0() -> Double {
    return 1 + Double(arc4random_uniform(2000)) / 1000.0
}

for index in 1...10 {
    print(randomNumberBetween1_0And3_0())
}

示例输出为: 2.087 1.367 1.867 1.32 2.402 1.803 1.325 1.703 2.069 2.335

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多