【问题标题】:Getting a random double value between -1 and 1获取介于 -1 和 1 之间的随机双精度值
【发布时间】:2012-02-21 21:47:11
【问题描述】:

我正在用 Java 创建一个神经网络,需要创建一个方法来最初生成随机权重。

我需要创建一个函数,它返回一个介于 -1 和 1 之间的随机双精度值,但不确定这样做的逻辑,因此非常感谢任何帮助。

【问题讨论】:

  • 您希望它在范围末端包含还是排除?还是两端不一样?在谈论范围时,您应该始终指定这一点。您迄今为止的答案包括 -1 但不包括 1。
  • ...因为 Math.random() 返回一个带正号的双精度值,大于或等于到 0.0 并且小于 1.0 .直到大约 30 秒前我才知道...
  • @pax 在处理实际间隔时,无论如何都不会选择端点almost surely。当处理浮点区间时,随机选择端点的概率仅略高。
  • @MichaelMcGowan,这对于上端点是正确的,但不是下端点,nextInt() 及其兄弟通常会返回零 - 嗯,与预期的一样频繁:-) 我只是说它很重要了解两个端点的期望行为(在问题中)和实际行为(在答案中)。
  • @Michael 就我个人而言,我通常会包括下限,但不包括上限 - 我看不出有什么好的理由为浮点数更改它? (好吧,higher bound == lower bound of next element 不太可能对浮点数有用,但为什么要使用两种不同的约定呢?)

标签: java random


【解决方案1】:

您可以使用Random 类的 nextDouble() 方法。

Random rng = new Random();
// to get a double between -1 and 1
return rng.nextDouble() * 2 - 1; // rng.nextDouble() is between 0 and 1

【讨论】:

  • 而且,除非我遗漏了什么,SplittableRandom().nextDouble(-1, 1 + Double.MIN_VALUE) 应该在 -1 和 1 之间给你加倍(包括两者)
  • @Joschua 你可能需要 Math.nextUp,而不是 + Double.MIN_VALUE。
  • 嗯.. 结果不一样吗? Math.nextUp 返回在正无穷方向上与 d 相邻的浮点值。 (来自docs)。那应该是d + MIN_VALUE AFAICS。它还提到“如果参数为零,则结果为 Double.MIN_VALUE”。也许nextUp 更干净。
  • @Joschua d + MIN_VALUE 只是 d 的下一个更高的数字,如果 d 足够小的话;否则 d + MIN_VALUE == d。 Math.nextUp(d) == d + Math.ulp(d)。
  • 哦..哇。我想我对浮点数的了解并不像我想象的那么多。谢谢!
【解决方案2】:

Math.random() 会给你一个介于 0 和 1 之间的随机双精度数。你可以将该结果乘以 2 并减去 1 以获得介于 -1 和 1 之间的随机双精度数。

或者,您可以将相同的转换应用于从java.util.Random 调用nextDouble() 方法,但这需要Random 的显式实例,而这是使用Math.random() 在幕后完成的。

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 2021-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多