2015-04-20 51 views
-4

我正在Java中实现一个测试数据生成器,用于为Java基本类型生成随机值。 可能的参数值范围不受限制。例如,如果我想生成一个随机整数或浮点数,我会考虑所有可能的值(MAX_INT-MIN_INT)。要做到这一点,我使用的东西,如:。为什么java中的随机函数总是生成高值?

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

但是,做这样的,我注意到,所产生的值总是高(接近最大值和价值低参数类型)。例如,经过100000次迭代后,随机算子不会在[-1000 - 1000]范围内生成一个值。对于花车,多头也是一样。等等,...

你能不能给我的随机操作人员如何在Java执行的解释?为什么当我们考虑Java类型的所有可能值时,生成的值总是很高?

在此先感谢。

+0

尝试总结大量的生成值。由于它的分布是均匀的,所以总和将趋向于0. –

+1

概率是215万之一,所以我建议你用1000万的平局重试,你应该会看到一些数字出现...... – assylias

+0

有很多大数字,并不是很多小数字,所以当然你会比小数字大得多。 (你确实要求统一分配...) – immibis

回答

11

“高”和“低”的说法是错误的。

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

这个概率是非常小的,因而也是“小”变量的预期数目会很小。

事实上,在均匀分布[MIN_INT,MAX_INT],大约一半的元件将是正 - 和负半。
同样,只有其中的四分之一将是0之间MAX_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]

需要注意的是:


看一看这段代码snippest关于浮点数,每个的理论概率是〜1 /(2 * MAX)〜= 14.7%。

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

+1

@staticx定义“接近MIN或MAX的极限 - 它们之间的接近程度?它们之间的MAX-1000到MAX? – amit

+0

我的意思是接近Float的最大值和最小值(对于长类型而言是相同的) – staticx

+0

@staticx'int count1 = 0,COUNT2 = 0; \t \t的for(int i = 0; I <10000;我++){ \t \t \t浮子X = genFloat(NULL); \t \t \t如果(X < 1000 && x > 0)COUNT1 ++; \t (x> Float.MAX_VALUE - 1000)count2 ++; \t \t} \t \t System.out.println(count1); \t \t System.out.println(count2);'结果都是0对我。你的看法是错误的。你认为MAX-100000是“接近MAX”,但100000不小,均匀分布,同样的机会在[0,100000]和[MAX-100000,MAX] – amit