gpt4 book ai didi

java - 在独占范围内生成随机 double

转载 作者:行者123 更新时间:2023-12-01 09:29:20 25 4
gpt4 key购买 nike

我正在尝试生成一个介于(但不包括)下限和上限之间的随机 float (下限,上限)。我见过很多关于生成数字的问题,包括它的下限,但不包括它的上限 [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;

虽然这将保证我在第一次尝试时得到一个有效的数字,但我不相信这种情况下的分布是均匀的。

谢谢

最佳答案

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

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

只需将 != 替换为 == 即可。这并不是说效率低下。

<小时/>

看看代码的效率。

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

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

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

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

关于java - 在独占范围内生成随机 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39575237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com