【问题标题】:Swift Linux Generate Random BoolSwift Linux 生成随机布尔值
【发布时间】:2023-03-28 23:54:01
【问题描述】:

我正在尝试对Bool 进行静态扩展,以便在调用时返回一个随机的真/假值。我正在努力完成这项工作:

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

【问题讨论】:

    标签: linux swift server-side-swift


    【解决方案1】:

    从 Swift 4.2 开始,有一种本地方式可以做到这一点:

    let flippedCoin = Bool.random()
    

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

    【讨论】:

      【解决方案2】:

      time(nil)) 以 秒数的形式返回当前时间, 这意味着 您使用 same value 播种随机数生成器时 该方法在一秒内被多次调用。

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

      【讨论】:

        猜你喜欢
        • 2017-09-05
        • 2016-08-13
        • 2014-10-06
        • 2013-10-12
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        • 2012-01-15
        相关资源
        最近更新 更多