我正在尝试对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()
的伪随机序列是一个问题吗?我不知道该怎么做。在此先感谢您的帮助!
答案 0 :(得分: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())
}
答案 1 :(得分:0)
从Swift 4.2开始,有一种本机的方法:
let flippedCoin = Bool.random()
文档:https://developer.apple.com/documentation/swift/bool/2994861-random