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

sta*_*icx -4 java random automated-tests probability

我在java中实现了一个测试数据生成器,用于生成java原始类型的随机值.可能的参数值的范围不受限制.例如,如果我想生成随机整数或浮点数,我会考虑所有可能的值(MAX_INT-MIN_INT).为此,我使用的东西如下:

  • 随机的().nextInt()
  • 随机的().nextLong()
  • 随机的().nextFloat()*Float.MAX_VALUE
  • 随机的().nextDouble()*Double.MAX_VALUE
  • 等等...

但是,这样做,我注意到生成的值总是很高(接近参数类型的最大值和最小值).例如,在100000次迭代之后,随机运算符未生成[-1000 - 1000]范围内的值.对于花车来说同样的事情,多头.等等,...

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

提前致谢.

ami*_*mit 11

你的"高"和"低"的先例是错误的.

单个值(假设均匀分布)的概率是在[-1000,1000]IS 2001/(MAX_INT-MIN_INT),是绕0.00000046.

该概率非常小,因此预期的"小"变量数量也很小.

实际上,在均匀分布中[MIN_INT,MAX_INT],大约一半的元素将是正的 - 而一半是负的.
同样,只有其中的四分之一会之间0MAX_INT/2(比1000要高得多,你知道的).

如果你想要更多的"低"值,可以将自己缩小到较小的元素范围,或者使用非均匀分布,这种分布有望产生更接近0的值(例如高斯值).


看看这段代码:

       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);
Run Code Online (Sandbox Code Playgroud)

它会生成10000个随机浮点数,并检查其中包含的数量[0,1E38]和数量[MAX-1E38,MAX]

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

正如您所看到的,在相同范围内的"接近0"和"接近MAX"在其范围内产生的变量经验数相似.