Math.random范围为负数

时间:2018-03-28 22:57:23

标签: java

如果我这样做: Math.random()* 4-2

这会给我一系列(-2,2),2是独家吗?我认为这是正确的,但我很少得到正数(是的,我知道这是一个随机算法,我们必须随机无限地生成它以感觉但我只是想确保)

新问题

如果我想要从-1到1的所有随机有理数,两个边界都包含在内,这条线是否会起作用: Math.random()* 2.0000000000000001 - 1;

我抬头看到小数点后面的两倍可以存储大约52位,大约是16位数,这大约是过去这一点的0的数字。

我正在研究的项目是使用蒙特卡罗模拟估算pi的数字,如果你对此有所了解,那么也许你理解我为什么要问所有这些东西。

2 个答案:

答案 0 :(得分:2)

  

这会给我一系列(-2,2),2是独家吗?

是的,Math.random() * 4-2在-2到1的范围内为您提供了4种可能性。

您需要更多次运行才能检查分发情况。

int[] occ = new int[4];
for(int x=0; x<1000000; x++){
    int rand = (int)(Math.random() * 4)-2;
    occ[rand+2] ++;
}

System.out.println("Occurrences for -2: " + occ[0]/10000.0 + "%");
System.out.println("Occurrences for -1: " + occ[1]/10000.0 + "%");
System.out.println("Occurrences for 0: " + occ[2]/10000.0 + "%");
System.out.println("Occurrences for 1: " + occ[3]/10000.0 + "%");

100万次测试的测试显示随机数分布很好:

Occurrences for -2: 24.9779%
Occurrences for -1: 25.0338%
Occurrences for 0: 24.971%
Occurrences for 1: 25.0173%

答案 1 :(得分:0)

Math.random()返回一个[0,1.0]范围内的值,因此你的表达式应该返回值[-2.0,2.0),其中2.0是独占的,而-2.0是包含的。

Math.random()是一个伪随机数生成器,因此可以解释您的负数趋势。如果您想要更好地分配值,您将希望查看真正随机数生成的实现。