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

Why the random function in java is always generating high values?

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

的东西

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

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

提前致谢。

你对"high"和"low"的理解是错误的。

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

这个概率极小,因此"small"变量的预期数量也会很小。

事实上,在 [MIN_INT,MAX_INT] 上的均匀分布中,大约一半的元素为正,一半为负。
同样,只有四分之一会在 0MAX_INT/2 之间(如您所知,这比 1000 高得多)。

如果您想要更多 "low" 值,请将自己缩小到更小的元素范围,或者使用非均匀分布,这样可以生成更多接近 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%。

如您所见,同一范围内的 "close to 0" 和 "close to MAX" 在其范围内产生的变量的经验数量相似。