为什么java中的随机函数总是生成高值?

为什么java中的随机函数总是生成高值?,java,random,automated-tests,probability,Java,Random,Automated Tests,Probability,我正在用java实现一个测试数据生成器,用于为java基本类型生成随机值。 可能参数值的范围不受限制。例如,如果我想生成一个随机整数或浮点,我会考虑所有可能的值(Max ItIn Min It)。为此,我使用了以下内容: Random().nextInt() Random().nextLong() Random().nextFloat()*Float.MAX_值 Random().nextDouble()*Double.MAX_值 等等 但是,这样做时,我注意到生成的值总是很高(接近参数类型

我正在用java实现一个测试数据生成器,用于为java基本类型生成随机值。 可能参数值的范围不受限制。例如,如果我想生成一个随机整数或浮点,我会考虑所有可能的值(Max ItIn Min It)。为此,我使用了以下内容:

  • Random().nextInt()
  • Random().nextLong()
  • Random().nextFloat()*Float.MAX_值
  • Random().nextDouble()*Double.MAX_值
  • 等等
但是,这样做时,我注意到生成的值总是很高(接近参数类型的最大值和最小值)。例如,在100000次迭代之后,随机运算符没有生成[-1000-1000]范围内的值。浮点数和长点数也是一样。等等

你能给我解释一下随机运算符在Java中是如何执行的吗?当我们考虑java类型的所有可能值时,为什么生成的值总是很高?

提前谢谢。

你关于“高”和“低”的说法是错误的

单个值(假设均匀分布)位于
[-10001000]
的概率为
2001/(MAX\u INT-MIN\u INT)
,约为0.00000046

这种可能性非常小,因此“小”变量的预期数量也将很小

事实上,在
[MIN\u INT,MAX\u INT]
的均匀分布中,大约一半的元素为正,一半为负。
类似地,其中只有四分之一在
0
MAX_INT/2
之间(如您所知,这远高于1000)

如果您想要更多的“低”值,请将您自己的范围缩小到更小的元素范围,或者使用非均匀分布,以生成更多接近0的值(对于exmaple)


看看这个代码snippest:

       int count1 = 0, count2=0;
       for (int i = 0; i < 10000; i++) { 
           float x = genFloat(null);
           if (x < 1E38 && x > 0) count1++;
           if (x > Float.MAX_VALUE - 1E38) count2++;
       }
       System.out.println(count1);
       System.out.println(count2);
int count1=0,count2=0;
对于(int i=0;i<10000;i++){
float x=genFloat(空);
如果(x<1E38&&x>0)count1++;
如果(x>Float.MAX_值-1E38)count2++;
}
系统输出打印项次(计数1);
System.out.println(count2);
它生成10000个随机浮点数,并检查有多少浮点数在
[0,1E38]
中,以及有多少浮点数在
[MAX-1E38,MAX]

注意,当谈到浮点数时,每个浮点数的理论概率为~1/(2*MAX)~=14.7%


如您所见,同一范围内的“接近0”和“接近最大值”在其范围内产生的变量的经验数量相似。

尝试总结大量产生的值。由于它具有均匀分布,总体总和将趋向于0。概率为215万分之一,因此我建议您以1000万次左右的抽签重试,您应该会看到其中一些数字出现……有很多大的数字,而不是很多小的数字,因此,当然,您得到大的数字比得到小的数字更频繁。(你确实要求均匀分布…)是的,我想是的,这是一个概率保护的int-genInteger(参数p){return new Random().nextInt();}受保护的float-genFloat(参数p){return(2*(new Random().nextFloat())-1)*float.MAX_值;}受保护的long-genLong(参数p){return new Random().nextLong()}这里是代码片段。我发现它有点连线,因为在10000次迭代之后,它无法在[-1000-1000]之间生成至少一个值。但是,当我显示生成的值时,我可以看到它们总是接近最大值或最小值的限制。您如何解释?@staticx Define“接近最小值或最大值的限制-有多接近?它们是否在最大值-1000到最大值之间?我的意思是接近浮点最大值和最小值(对于长型相同)@staticx
intcount1=0,count2=0;for(inti=0;i<10000;i++){float x=genFloat(null);if(x<1000&&x>0)count1++;if(x>float.MAX_值-1000)count2++}System.out.println(count1);System.out.println(count2)
结果对我来说都是0。你的预测是错误的。你认为MAX-100000“接近MAX”,但100000并不小,在均匀分布中,出现[0100000]和[MAX-100000,MAX]的几率是相同的谢谢,事实上是的,结果是0。你有什么建议?我需要探索浮点值或具有相同概率的整数值中所有可能值的范围可能我应该在Java中使用其他类型的随机分布。你知道在[max range-min range]中生成值的其他方法吗?当然是在Java中