Swift rand()不是随机的

时间:2014-06-26 22:58:19

标签: random swift

今天是我与Swift的第一天,我遇到了一个问题。我使用rand生成一个随机数,但每次运行代码时它都会给我相同的结果。

main.swift:

import Foundation

var player = Player()

for _ in 1..6 {
    println(player.kick())
}

player.swift:

import Foundation

class Player {
    var health = 25
    var xp = 15
    var upgrades = ["kick": 0, "punch": 0]

    func kick() -> Int {
        let range = (3, 7)
        let damage = Int(rand()) % (range.1 - range.0) + range.0 + 1
        return damage
    }

    func punch() -> Int {
        let range = (4, 6)
        let damage = Int(rand()) % (range.1 - range.0) + range.0 + 1
        return damage
    }
}

每次运行代码时,都会记录这些数字:

7
5
5
6
6

我也试过这个:Int(arc4random(range.1 - range.0)) + range.0 + 1但是它说找不到接受提供的参数的+的重载

我不知道为什么会发生这种情况。我很感激一些帮助,谢谢!

3 个答案:

答案 0 :(得分:11)

你永远不应该使用rand(),使用arc4random - 它是一个更好的发电机。如果检查其手册页,您会发现它有一个名为arc4random_uniform()的整数范围生成器形式,当模数不是2的幂时,您应该使用它来避免模偏差。我相信以下是你想要的,它在操场上对我有用:

let damage = arc4random_uniform(UInt32(range.1 - range.0) + 1) + UInt32(range.0)

+ 1是因为arc4random_uniform()的上端是非包含性的。如果您的范围是(4,7),则应该出现4,5,6和7。

答案 1 :(得分:8)

在大多数编程环境中,

rand()通过设计为您提供可重复的伪随机数序列。查找名为seedsrand的函数,了解初始化随机数生成器的方法。

答案 2 :(得分:-2)

使用rand()没问题,您可以在程序开头使用此调用对伪随机数生成器进行播种:

srand(UInt32(time(nil)))