Swift Linux 生成随机布尔值

Swift Linux Generate Random Bool

我正在尝试将 Bool 静态扩展到 return 随机 true/false 值,无论何时调用。我正在努力使这项工作:

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 应用程序调用的路由范围内使用它。每当它第一次被调用时,它都会 return 一个随机值,但在同一范围内对该函数的所有后续调用都不会随机化输出。例如:

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()的伪随机序列有问题吗?我不知道该怎么办。预先感谢您的帮助!

time(nil)) returns 当前时间为 秒数, 表示 您使用 相同的值 为随机数生成器播种 该方法在一秒间隔内被多次调用。

您应该在申请时只致电 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())
}

从 Swift 4.2 开始,有一种本机方法可以执行此操作:

let flippedCoin = Bool.random()

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