代码之家  ›  专栏  ›  技术社区  ›  Fredrik Bakke

在独占范围内生成随机双精度

  •  0
  • Fredrik Bakke  · 技术社区  · 8 年前

    我正在尝试生成一个介于但不包括其上下限的随机浮点数 (lower, upper) . 我见过很多关于从生成数字的问题,包括它的下界到,但不包括它的上界 [lower, upper) ,但这不是我想要的。

    我已经为这个问题想出了两个“解决方案”,但都不太满意。

    第一个“解决方案”

    double myvalue;
    do { myvalue = myrandom.nextDouble() * (upper - lower) + lower; } while (myvalue == lower);
    

    虽然这几乎每次都会在第一次尝试时给出一个有效的结果,但它看起来不一致且笨拙,而且很可能RNG会多次返回零,这也是低效的。

    第二个“解决方案”

    double myvalue = 
    0.5 * (1.0 + myrandom.nextDouble() - myrandom.nextDouble()) * (upper - lower) + lower;
    

    虽然这可以保证我在第一次尝试时得到一个有效的数字,但我不认为在这种情况下分布是统一的。

    谢谢

    2 回复  |  直到 3 年前
        1
  •  1
  •   Davide Lorenzo MARINO    8 年前

    您的第一个代码非常正确。

    double myvalue;
    do { 
        myvalue = myrandom.nextDouble() * (upper - lower) + lower; 
    } while (myvalue == lower);  // Replace != with ==
    

    只需更换 != 具有 == 这并不是真的没有效率。


    代码的效率。

    查看的代码 nextDouble 您可以看到,它是通过生成一个随机长值来计算的。

    这意味着基本上您将有1个机会在2*9223372036854775807(长值的范围减1)上重复循环。

    附加说明 :因为您正在使用 double 而不是 BigDecimal 您可以获得 myvalue lower 绑定,但低于它,因此最好将代码更改为 还排除低于以下值的值 降低 。它不会改变代码的效率。

    double myvalue;
    do { 
        myvalue = myrandom.nextDouble() * (upper - lower) + lower; 
    } while (myvalue <= lower);  // Replace != with <=
    
        2
  •  -1
  •   jseashell    8 年前

    尝试 ThreadLocalRandom.current().nextDouble(origin + 1, bound) 。根据javadoc,默认情况下,最小值是包含的,最大值是排除的