【问题标题】:How to print from two lists on swift如何从 swift 的两个列表中打印
【发布时间】:2018-06-06 12:46:30
【问题描述】:

如果我有一个名字列表,然后是一个第二个名字列表,那么我如何从每个列表的 1 个中打印随机选择

let arrayX = ["James", "Andrew", "Sean"]
let arrayY = ["Smith", "Docherty", "Anderson"]

所以我可以选择詹姆斯史密斯或安德鲁安德森?

【问题讨论】:

    标签: arrays swift list random names


    【解决方案1】:

    使用随机生成的索引获取字符串。

    let arrayX = ["James", "Andrew", "Sean"]
    let arrayY = ["Smith", "Docherty", "Anderson"]
    
    print(arrayX[getRandomIndex(maxRange: arrayX.count)], arrayY[getRandomIndex(maxRange: arrayY.count)])
    

    生成随机索引的函数:

    func getRandomIndex(maxRange: Int) -> Int{
        return Int(arc4random_uniform(UInt32(maxRange)))
    }
    

    【讨论】:

      【解决方案2】:

      要从数组中选择一个随机项,您需要在其索引范围内生成一个随机数。

      您可以在 Swift 中使用 arc4random_uniform 执行此操作:

      Int(arc4random_uniform(UInt32(arrayX.count)))
      

      一旦你知道如何做到这一点,你就可以很容易地从你的数组中生成一个随机名称:

      let arrayX = ["James", "Andrew", "Sean"]
      let arrayY = ["Smith", "Docherty", "Anderson"]
      
      let randomForenameIdx = Int(arc4random_uniform(UInt32(arrayX.count)))
      let randomSurnameIdx = Int(arc4random_uniform(UInt32(arrayY.count)))
      
      let randomName = "\(arrayX[randomForenameIdx]) \(arrayY[randomSurnameIdx])"
      

      【讨论】:

      • 我对您的这一点有疑问:我们这样做的原因 - 索引中的 1 是因为数组具有从零开始的索引。所以它从 0 开始。如果你 [1, 2, 3] 索引是 0, 1, 2。 我认为它使范围从 0 到(给出的范围) - 1。所以我们不t 需要传递 arrayX.count - 1 ,因为它只会给出值 0 和 1 而不会给出 2。
      • 价值观本身并不重要。它可以是 [4,5,6],长度是 3。所以 arc4random_uniform(3) 会给你值 0、1、2、3(4 个值)所以如果你不从计数中减去 1,你会得到一个随机数为 4 时的边界错误,因为索引 4 不存在
      • 除非我记错了,我会测试确认
      • 是的,这正是我的疑问,我认为 arc4random_uniform(3) 会生成值 [0,1,2] 3 个值,而不是 4。是的,请确认我也在运行计时器及其打印 [0 ,1,2] 仅
      • 看起来你是对的,我进行了 100k 次测试,但从未得到价值。更新答案
      【解决方案3】:

      Swift 有一种很好的方式来使用 zip 函数来交织数组:

      let firstNames = ["James", "Andrew", "Sean"]
      let lastNames = ["Smith", "Docherty", "Anderson"]
      
      let randomIndex = Int(arc4random_uniform(UInt32(firstNames.count)))
      let randomName = Array(zip(firstNames, lastNames))[randomIndex]
      print("\(randomName.0) \(randomName.1)")
      

      zip(_:_:) 接受两个集合(即数组)并返回一个元组对序列,其中每对的元素是两个集合的对应元素。 Array 初始化器将结果转换为元组数组。

      此解决方案始终匹配名字和姓氏,即。 e.你要么得到詹姆斯史密斯,安德鲁多尔蒂,要么肖恩安德森。如果这不是您想要的,那么您将需要两个随机索引并且没有 zip 函数,正如其他答案中所建议的那样。

      【讨论】:

        猜你喜欢
        • 2020-04-03
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 1970-01-01
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        相关资源
        最近更新 更多