3

我正在尝试进行静态扩展,Bool以便在调用时返回随机的真/假值。我正在努力使这项工作:

static func coinFlip() -> Bool {
    #if os(Linux)
    srand(UInt32(time(nil)))
    let result = Int(random() % 2)
    if result == 0 {
        return false
    } else {
        return true
    }
    #else
    return arc4random_uniform(2) == 0
    #endif
}

我在服务器端 Swift 应用程序中调用的路由范围内使用它。每当第一次调用它时,它确实返回一个随机值,但在同一范围内对该函数的所有后续调用都不会随机化输出。例如:

for _ in 1...5 {
    let coin = Bool.coinFlip()
    if coin == true {
        print("coin flip true")
    } else {
        print("coin flip false")
    }
}

...产生这样的输出:

coin flip false
coin flip false
coin flip false
coin flip false
coin flip false

...但是如果我再次单独调用该路线,我可以获得:

coin flip true
coin flip true
coin flip true
coin flip true
coin flip true

srand(UInt32(time(nil)))仅随机化 的伪随机序列是否有问题random()?我不知道该怎么办。在此先感谢您的帮助!

4

2 回答 2

4

time(nil))以秒数返回当前时间,这意味着当在一秒的时间间隔内多次调用该方法时,您将使用相同的值作为随机数生成器的种子。

您应该srand(UInt32(time(nil)))只在应用程序启动时调用一次,而不是在每次调用coinFlip().

此外,该功能可以简化一点,我称之为random(),而不是coinFlip()

#if os(Linux)
    srand(UInt32(time(nil)))
#endif

extension Bool {
    static func random() -> Bool {
        #if os(Linux)
            return Glibc.random() % 2 == 0
        #else
            return arc4random_uniform(2) == 0
        #endif
    }
}

for _ in 1...5 {
    print(Bool.random())
}
于 2017-03-11T15:57:09.050 回答
0

从 Swift 4.2 开始,有一种本地方法可以做到这一点:

let flippedCoin = Bool.random()

文档:https ://developer.apple.com/documentation/swift/bool/2994861-random

于 2018-11-13T03:21:07.710 回答