我正在尝试对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] 举报,一经查实,本站将立刻删除。