在swift中如何生成随机数?

5

简单来说,我该如何生成一个随机数呢?因为书中的方法每次都会选出相同的数字。

根据苹果发布的书籍,以下是在Swift中生成随机数的方法。

protocol RandomNumberGenerator {
    func random() -> Double
}
class LinearCongruentialGenerator: RandomNumberGenerator {
    var lastRandom = 42.0
    let m = 139968.0
    let a = 3877.0
    let c = 29573.0
    func random() -> Double {
        lastRandom = ((lastRandom * a + c) % m)
        return lastRandom / m
    }
}
let generator = LinearCongruentialGenerator()

for _ in 1..10 {
    // Generate "random" number from 1-10
    println(Int(generator.random() * 10)+1)
}

问题在于我放在底部的那个for循环,输出结果看起来像这样:
4
8
7
8
6
2
6
4
1

每次运行,输出结果都相同,不管运行多少次。

我看了其他评论,他们实际上只是复制粘贴书中的内容。 - slooker
看一下另一个问题中的答案。它们比这个简单得多,也不需要种子。 - Connor
是的。我要删除这个问题,因为它是重复的。arc4random()更简单。抱歉!--编辑,无法删除,因为有答案。噢,好吧。 - slooker
2个回答

5
您创建的随机数生成器并不是真正的随机数,而是伪随机数。
使用伪随机数生成器,序列取决于种子。更改种子,您将更改序列。
一种常见用法是将种子设置为当前时间,这通常足够随机。
您还可以使用标准库:arc4random()。不要忘记import Foundation

1
它并不是真正的伪随机。它相当确定性。 - Michael Petrotta
当我尝试在playground中调用arc4random()时,会出现“未解决的标识符'arc4random'的使用”错误。我该如何使用标准库? - Dan Hixon
如果你 import Foundation,似乎可以工作。 - Austin
1
@MichaelPetrotta,我不确定你能否找到一个不是“相当确定性”的伪随机数生成器。 - zneak
@MichaelPetrotta 这就是大多数随机数函数的实现方式。曾经让我感到惊讶,但现在不再了。 - Anubian Noob
显示剩余4条评论

0

伪随机数生成器需要一个“种子”值。在您的情况下,如果您将lastRandom替换为任何数字,您将获得不同的序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接