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

时间:2016-09-19 14:08:17

标签: java random double range

我正在尝试生成一个随机双倍但不包括它的下限和上限(下限,上限)。 我已经看到很多关于从中生成数字的问题,包括它的下限,但不包括它的上限[下限,上限],但他们没有回答我的问题,因为他们没有解决这个问题。

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

第一个“解决方案”

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

虽然这几乎每次都会在第一次尝试时给出有效的结果但看起来不一致和笨重,并且在rng很多时候返回0.0的可能性很小,它也是低效的。

第二个“解决方案”

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

虽然这会在第一次尝试时保证我有效的号码,但我不相信在这种情况下分配是统一的。

感谢

2 个答案:

答案 0 :(得分:1)

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

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

只需将!=替换为==即可。这不是有效的。

了解代码的效率。

看一下nextDouble的代码,你可以看到它的计算是生成一个随机的长值。

这意味着基本上你有可能在2 * 9,223,372,036,854,775,807(长值减去1的范围)上重复循环。

附加说明:因为您使用的是double而不是BigDecimal,所以您可以获得接近myvalue界限的lower ,但低于它,因此最好将代码更改为排除低于lower 的值。它不会改变代码的效率。

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

答案 1 :(得分:0)

试试ThreadLocalRandom.current().nextDouble(origin + 1, bound)。根据javadoc,min是包含的,默认情况下max是独占的