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

时间:2015-04-20 11:41:03

标签: 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类型的所有可能值时,为什么生成的值总是很高?

提前致谢。

1 个答案:

答案 0 :(得分:11)

你的“高”和“低”的先例是错误的。

单个值(假设均匀分布)在[-1000,1000]中的概率为2001/(MAX_INT-MIN_INT),大约为0.00000046。

这个概率极小,因此“小”变量的预期数量也很小。

事实上,在[MIN_INT,MAX_INT]上的均匀分布中,大约一半的元素是正的 - 而一半是负的。
同样地,只有四分之一在0MAX_INT/2之间(如你所知,远高于1000)。

如果您想要更多“低”值,请将自己缩小到较小范围的元素,或使用非均匀分布,预期会产生更接近0的值(例如gaussian)。


看一下这段代码:

       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);

它会生成10000个随机浮点数,并检查[0,1E38]中的累计数以及[MAX-1E38,MAX]

中的累计数量

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

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