【问题标题】:How to generate a random number in a range (10...20) using Swift [duplicate]如何使用 Swift 生成范围(10...20)内的随机数 [重复]
【发布时间】:2016-01-11 00:29:25
【问题描述】:

我可以在我的游戏中为我的物品选择一个随机数,但是 是否可以在 2 个数字之间选择一个随机数?

所以而不是

let number = (arc4random_uniform(100))

我想要这样的东西:

let number = (arc4random_uniform(10...20))

或类似的东西? 现在,如果我得到一个武器掉落,它可以是我列表中的所有内容。 通过这种方式,我可以做到只有前几个会掉落特定怪物,或者在更高级别时他们会掉落更好的武器,而不再是低级别。

【问题讨论】:

标签: swift random range


【解决方案1】:

Xcode 11 • Swift 5.1 或更高版本

extension Range where Bound: FixedWidthInteger {
    var random: Bound { .random(in: self) }
    func random(_ n: Int) -> [Bound] { (0..<n).map { _ in random } }
}

extension ClosedRange where Bound: FixedWidthInteger  {
    var random: Bound { .random(in: self) }
    func random(_ n: Int) -> [Bound] { (0..<n).map { _ in random } }
}

注意:对于较旧的 Swift 版本,请检查编辑历史记录

用法:

(10...20).random    // 16
(0...1).random(10)  // [0, 1, 0, 0, 1, 1, 1, 1, 1, 0]

【讨论】:

  • 不要在这里使用hashValue——它返回的值是一个实现细节,因此可能会发生变化(它只是碰巧返回一个相同的Int在这种情况下的价值)。始终返回 0 将是有效的(尽管无效)hashValue 实现,但会完全破坏您的随机逻辑。一种更可靠的方法是通过IntMax 代替——例如Int(lowerBound.toIntMax()) + Int(arc4random_uniform(UInt32((upperBound - lowerBound + 1).toIntMax())))
  • IMO 也是,这里的方法比计算属性更合适,因为重复调用它会产生不同的结果(我不希望计算属性这样做)。
  • @Hamish 感谢您的意见。我同意 toIntMax() 是合适的方法,但我更喜欢它作为计算属性。我对所有东西都使用计算属性,我从没想过它是静态的。
  • 这段代码给人的错觉是它可以处理任意整数。但如果upperBound - lowerBound + 1 超出 UInt32 范围,它会崩溃。比较 stackoverflow.com/questions/31391577/… 以了解一些适用于“大”整数的代码。
  • 顺便说一句,使用reduce 作为map 替换是非常无效的。
猜你喜欢
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多