【问题标题】:Java Random.nextDouble() probabilityJava Random.nextDouble() 概率
【发布时间】:2016-09-27 07:18:51
【问题描述】:

我正在尝试使用 Random.nextDouble() 获取 1.0 和 10.0 之间的随机双数:

double number = 1.0 + (10.0-1.0) * Random.nextDouble();

模拟这 10,000 次我发现 1.0 和 10.0 的概率低于其余的。获得这些数字的唯一方法是要求 Random.nextDouble() 为 0.0 或 1.0。所以本质上因为Random.nextDouble() 给出了一个介于 0.0 和 1.0 之间的随机数,它实际上不太可能导致 0.0 或 1.0。

我想知道有没有办法解决这个问题?还是我应该尝试一种完全不同的方式?

编辑:

所以问题确实在于生成随机双精度数后将数字四舍五入到小数点后一位。我现在做的一个非常粗略的解决方案是在 0 到 91 之间生成一个 randomIntValue,然后像这样初始化 double number = 1.0 + (randomIntValue * 0.1)

这不是我想说的最干净的选择。

【问题讨论】:

标签: java random probability


【解决方案1】:

首先要注意的是(10.0-1.0)在IEEE754双精度浮点中完全正确9.0

接下来要注意的是Random.nextDouble() 返回一个严格小于1.0 但大于或等于0.0 的数字。它永远不会绘制1.0

所以我们可以自信地将你的表达写成

1.0 + 9.0 * Random.nextDouble().

偶尔会绘制10.0 的事实是由于浮点不精确(在这种情况下,不需要舍入到最接近的浮点数)。本质上,这个概率是从1.0 绘图中“借来的”。即使随机数生成器是完美的,情况也会如此。

对于浮点问题,没有“万能”的解决方案。在这种情况下,如果您的应用程序真的不能容忍偶尔出现的10.0,那么您可以将该绘图“归还”给1.0 案例。但请检查生成的生成器是否具有所需的统计属性。

【讨论】:

    【解决方案2】:

    所以问题确实在于生成随机双精度数后将数字四舍五入到小数点后一位。我现在做的一个非常粗略的解决方案是在 0 到 91 之间生成一个 randomIntValue,然后像这样初始化 double number = 1.0 + (randomIntValue * 0.1)

    这不是我想说的最干净的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多