【问题标题】:Why the random function in java is always generating high values?为什么java中的随机函数总是产生高值?
【发布时间】:2015-04-20 11:41:03
【问题描述】:

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

  • Random().nextInt()
  • Random().nextLong()
  • Random().nextFloat()*Float.MAX_VALUE
  • Random().nextDouble()*Double.MAX_VALUE
  • 等等……

但是,这样做,我注意到生成的值总是很高(接近参数类型的最大值和最小值)。例如,在 100000 次迭代之后,随机运算符没有生成 [-1000 - 1000] 范围内的值。花车,多头也是一样。等等……

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

提前致谢。

【问题讨论】:

  • 尝试总结大量生成的值。由于分布均匀,总和趋于0。
  • 概率是 215 万分之一,所以我建议您重试 1000 万次左右,您应该会看到其中一些数字出现...
  • 大数字很多,小数字不多,所以当然大数字比小数字更常见。 (您确实要求均匀分布...)
  • 是的,我想是的,这是一个概率问题
  • protected int genInteger(Parameter p) { return new Random().nextInt(); } protected float genFloat(Parameter p) { return (2*(new Random().nextFloat())-1)*Float.MAX_VALUE; } protected long genLong(Parameter p) { return new Random().nextLong();这里是代码 sn-p 。我发现它有点连线,因为在 10000 次迭代之后,它无法生成至少一个介于 [-1000 - 1000] 之间的值。但是,当我显示生成的值时,我可以看到它们总是接近 MAX 或 MIN 的限制。你怎么解释?

标签: java random automated-tests probability


【解决方案1】:

你对“高”和“低”的理解是错误的。

单个值(假设均匀分布)在[-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”在其范围内产生的变量的经验数量相似。

【讨论】:

  • @staticx 定义“接近 MIN 或 MAX 的极限 - 有多接近?它们在 MAX-1000 到 MAX 之间吗?
  • 我的意思是接近浮点最大值和最小值(long类型相同)
  • @staticx int count1 = 0, count2=0; for (int i = 0; i &lt; 10000; i++) { float x = genFloat(null); if (x &lt; 1000 &amp;&amp; x &gt; 0) count1++; if (x &gt; Float.MAX_VALUE - 1000) count2++; } System.out.println(count1); System.out.println(count2); 对我来说都是 0。你的观点是错误的。您认为 MAX-100000 “接近 MAX”,但 100000 并不小,在均匀分布中,在 [0,100000] 和 [MAX-100000,MAX] 中的机会相同
  • 谢谢,事实上是的,结果是0。你有什么建议?我需要以相同的概率探索浮点或整数值中所有可能值的范围
  • 也许我应该在 Java 中使用其他类型的随机分布。您知道在 [max range - min range] 内生成值的其他方法吗?当然是在java中
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2015-05-16
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多