【问题标题】:How to print a random array in swift 2?如何在 swift 2 中打印随机数组?
【发布时间】:2016-02-07 14:30:35
【问题描述】:

如果我有一个类似的数组

var array = ["heads", "tails"]

如何打印或显示随机数?有时是正面还是反面?

我目前是初学者。

语言 - Swift 2

【问题讨论】:

    标签: swift2 swift-playground


    【解决方案1】:

    有两个选项可用于 IBM Sandbox...

    import SwiftShims
    var array = ["heads", "tails"]
    for _ in 0..<10 {
        print(array[Int(_swift_stdlib_arc4random_uniform(UInt32(array.count))])
    }
    

    import Glibc
    var array = ["heads", "tails"]
    for _ in 0..<10 {
       print(array[Int(random() % array.count)])
    }
    

    【讨论】:

      【解决方案2】:

      您只需要在0array length - 1 之间生成一个随机的Int

      然后使用该数字访问数组。

      let list = ["heads", "tails"]
      assert(!list.isEmpty)
      let random = Int(arc4random_uniform(UInt32(list.count)))
      print(list[random])
      

      【讨论】:

        【解决方案3】:

        使用返回随机Int的随机函数:

        import Foundation
        
        // returns randomly 0 or 1
        random() % 2
        
        // returns randomly had or tails
        array[random() % 2]
        

        不幸的是,在线 Swift 编译器不支持random(),因此我们必须自己实现一个随机生成器(来自Swift Book):

        // random generator
        final class LinearCongruentialGenerator {
            var lastRandom = 42.0
            let m = 139968.0
            let a = 3877.0
            let c = 29573.0
        
            func random() -> Double {
                lastRandom = ((lastRandom * a + c) % m)
                return lastRandom / m
            }
        }
        
        let r = LinearCongruentialGenerator()
        
        var array = ["heads", "tails"]
        for _ in 0..<100 {
            print(array[Int(r.random() * 2)])
        }
        

        这里是IBM Swift Sandbox

        【讨论】:

        • 它没有打印任何东西。
        • @user5895179 你必须使用打印:print(array[random() % 2])
        • 试过了。给出错误。我正在使用 swift 在线编译器。
        • @user5895179 编辑后的答案与在线 Swift 编译器兼容。
        • 谢谢!!上一个兼容xcode?​​span>
        【解决方案4】:

        你可以这样试试

        var array = ["heads", "tails"]
        

        假设

        var range = 100
        random() % range  // It Returns int
        

        它将返回一个介于 0 和 100 之间的随机数

        rand() % 2 // It Returns Int32
        
        array[rand()%2]  //Error
        array[random()%2]  //Random
        

        【讨论】:

          【解决方案5】:

          对于更通用的解决方案,对array 进行扩展以返回随机元素(如果数组为空,则为nil

          extension Array {
              func getRandomElement() -> Element? {
                  if self.count > 0 {
                      return self[Int(arc4random_uniform(UInt32(self.count) ?? 0))]
                  }
                  else {
                      return nil
                  }
              }
          }
          
          var arr = ["heads", "tails"]
          print(arr.getRandomElement() ?? "Array empty...") // "tails", ...
          

          或者,使用非通用压缩解决方案

          print(arr[Int(arc4random_uniform(2))])
          

          arc4random_uniform(n) 方法在0..&lt;n 范围内返回一个随机整数,在这种情况下,比使用random() 后跟模运算更好; random() 返回由Int 表示的任何 个整数。


          (我现在注意到您在 cmets 到 Qbyte:s 的回答中提到您正在使用似乎不支持的在线编译器,例如 arc4random_uniform。请参阅 @user3441734:s 回答以了解如何访问例如 @987654331 @这种情况下的方法)

          【讨论】:

          • dfri,您仍然可以在 Linux 平台(IBM Sandbox)上使用 arc4random_uniform。看我的回答,怎么做...
          猜你喜欢
          • 2014-05-10
          • 2020-10-31
          • 2019-03-22
          • 2012-12-23
          • 2013-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多