微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift Linux生成随机布尔

我正在尝试对Bool进行静态扩展,以在每次调用时返回随机的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应用程序中调用的路由范围内使用此方法.每当第一次调用它时,它都会返回一个随机值,但是在同一作用域中对该函数的所有后续调用都不会使输出随机化.例如:

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))以秒为单位返回当前时间,这意味着
您在以下情况下使用相同的值播种随机生成
方法在一秒钟的间隔内被多次调用.

您应仅在应用程序上调用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())
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐