【问题标题】:How to generate a float between 1 and 100如何生成 1 到 100 之间的浮点数
【发布时间】:2016-02-09 14:55:14
【问题描述】:

我正在尝试生成 1 到 100 之间的随机浮点数,但每次都会出错。目前我正在尝试:

func returnDbl ()-> Double {
    var randNum = Double(Float(arc4random(101) % 5))
    return randNum
}

print(returnDbl())

但无济于事,有人会指出我正确的方向吗?

【问题讨论】:

  • FloatDouble?
  • 它是一个返回双精度的函数,所以我将浮点数转换为双精度

标签: swift random


【解决方案1】:

arc4random 从零开始,返回 0 到 n-1 之间的值,将 100 作为上限并加 1

arc4random_uniform 更容易使用,它返回一个Int32 类型,必须转换为Float

func randomFloat() -> Float {
  return Float(arc4random_uniform(100) + 1)
}

Double

func randomDouble() -> Double {
  return Double(arc4random_uniform(100) + 1)
}

或通用

func returnFloatingPoint<T : FloatingPointType>()-> T {
  return T(arc4random_uniform(100) + 1)
}

let float : Float = returnFloatingPoint()
let double : Double = returnFloatingPoint()

编辑

使用arc4random_uniform() 使用返回 1.000000 和 99.99999 之间的非整数 Double

func returnDouble()-> Double {
  return Double(arc4random_uniform(UInt32.max)) / 0x100000000 * 99.0 + 1.0
}

0x100000000UInt32.max + 1

【讨论】:

  • 我有一个与此类似的答案,但是当我尝试将其转换为浮点数时,它给了我一个错误,总体目标是浮点数在 1 到 100 之间
  • 这永远不会返回 100。arc4random_uniform(99) 将生成一个 0-98 + 1 的数字,您将获得的最大数字是 99
  • 感谢您的注意,@LeoDabus
  • 这会生成 1 到 100 之间的随机整数,这些整数恰好被转换为浮点数或双精度数。
  • 我再次更新了答案以返回非整数双精度数。
【解决方案2】:
let a = 1 + drand48() * 99

drand48 是一个 C 函数,它返回 [0, 1) 范围内的 double。您可以直接从 Swift 调用它。乘以 99 会得到一个在 [0, 99) 范围内的 double。加一进入范围 [1, 100)。

由于drand48 返回double,Swift 类型将为Double


根据评论,drand48 在每次启动时默认返回相同的数字序列。你可以通过播种来避免这种情况。例如

seed48(UnsafeMutablePointer<UInt16>([arc4random(), arc4random()]))

【讨论】:

  • 我的设置是什么?我仍在努力掌握 swift 的窍门,仍然是一个 swift 新手,我大约 4 天了
  • 现在这就是我所拥有的,但它没有给我我想要的,即 1 到 100 之间的随机浮点数,它只是给了我 0 到 1 之间的浮点数 func returnDbl ()-> Double{ var randNum = Double(Float(arc4random() % 101) / 50) return randNum } print(returnDbl())
  • 当我在 Playground 中测试时,此解决方案总是返回相同的数字。不需要“播种”吗?
  • ive 将其调整为 soneon 给我的答案,但它只是返回双打,我试图通读文档,我看到了 UINT32_MAX ,有人告诉我我可以用它来得到我想要的结果,但我对如何设置感到困惑
  • 如果您希望它在每次启动时返回不同的数字序列,则需要对其进行播种。 seed48 才是重点。
【解决方案3】:
func returnDbl ()-> Double {
    var randNum = Double(Float(arc4random() % 101))
    return randNum
}

【讨论】:

  • 这只返回双打,我需要花车显示。这就是问题所在,我可以轻松地进行双打,但似乎我无法将浮点数转换为双打,有没有办法用 UINT32_MAX 方法做到这一点?
【解决方案4】:

好的,谢谢大家的帮助,你向我展示的设置帮助我弄清楚了设置至少应该是什么样子,我的最终结果是

func returnDbl()-> Double{ var randNum = Double(Float(arc4random_uniform(99)+1)) / Double(UINT32_MAX) 返回随机数 } 打印(returnDbl())

它返回 1 到 100 之间的浮点数。

【讨论】:

  • 这永远不会返回 100。arc4random_uniform(99) 将生成一个 0-98 + 1 的数字,您将获得的最大数字是 99
  • 但我希望在两者之间有大量的可能性,所以我可以接受 40 亿种可能性
  • 这是我使用这个“解决方案”得到的结果:6.51925802382623e-09, 1.86264514966464e-09, 2.11875885774353e-08...
  • 这似乎是对的,但我可能没有清楚地看到你在说什么。我想生成 1 - 100 之间的结果,它们必须是浮点数,但我返回一个双精度并且它必须是随机的。你说这不这样做,但对我来说似乎是这样,到底是什么问题?我对任何和所有建议持开放态度,我对此还是新手
  • 我明白你在说什么,我的最高结果是 9.54605639203127e-09,你有什么建议让我修改我的代码?
猜你喜欢
  • 2011-07-07
  • 2016-09-25
  • 2011-01-23
  • 2014-04-02
  • 1970-01-01
  • 2020-11-02
  • 2011-07-14
相关资源
最近更新 更多