Swift Linux 生成随机布尔值

3
我正在尝试创建一个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()的伪随机序列,这是否存在问题?我不确定该怎么做。提前感谢您的帮助!

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())
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接