gpt4 book ai didi

java - Random.nextDouble() 能否返回包含值?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:32:32 25 4
gpt4 key购买 nike

我正在玩弄 Random class's nextDouble()方法如下图。我希望 nextDouble() 在区间 [-50.0, 50.0) 上返回一个伪随机 double 值,但是,在运行循环 10 亿次后,输出结果为 最大值:49.99999995014588 最小值:-49.99999991024878。我在没有对输出间隔进行操作的情况下运行了循环,并且得到了 maximum: 0.9999999998979311 minimum: 0.0。我觉得这很奇怪,因为我对返回的 0.0 所做的只是将它乘以 100.0 再减去 50.0。为什么下面的代码片段永远不会准确返回 -50.0?

编辑:为了好玩,我又运行了 5 亿次循环,现在的输出是:最大值:49.99999994222232 最小值:-49.999999996750944

import java.util.Random;

public class randomTest{

public static void main(String[] args) {

double max = 0;
double min = 0;
Random math = new Random();
for(int a = 0; a < 1000000000; a++) {
double rand = math.nextDouble() * 100.0 - (100.0 / 2.0);
max = Math.max(max, rand);
min = Math.min(min, rand);
}
System.out.println("maximum: " + max + " minimum: " + min);
}
}

最佳答案

javadoc 明确指出 nextDouble() 的上限是独占的,而不是包含在内的。这意味着 1.0 将不会返回。

根据 javadoc,将返回 0.0 .... 概率大约为二分之一54。 (也就是18014398509481984中的一次。)

(它归结为确定对 next(27) 的两次连续调用是否将返回零。如果您检查 next(int) 使用的 LCNG 的规范,这是可能的。)


因此,您的代码不会达到 50.0,因为它不能。它应该能够达到 -50.0 但您可能需要按 1.0E19 次的顺序运行它才能实现。您只运行了 5.0E8 次。

关于java - Random.nextDouble() 能否返回包含值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40253211/

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