gpt4 book ai didi

Java Random.nextDouble() 概率

转载 作者:行者123 更新时间:2023-12-01 09:27:36 28 4
gpt4 key购买 nike

我正在尝试使用 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。

我想知道有什么办法可以解决这个问题吗?或者我应该尝试一种完全不同的方式?

编辑:

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

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

最佳答案

首先要注意的是,(10.0-1.0) 在 IEEE754 double 浮点中恰好 9.0

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

因此我们可以放心地将您的表达式写为

1.0 + 9.0 * Random.nextDouble()

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

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

关于Java Random.nextDouble() 概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39718440/

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