我在java中实现了一个测试数据生成器,用于为java原始类型生成随机值。 可能的参数值的范围不受限制。例如,如果我想生成随机整数或浮点数,我会考虑所有可能的值(MAX_INT-MIN_INT)。为此,我使用的是:
但是,这样做,我注意到生成的值总是很高(接近参数类型的最大值和最小值)。例如,在100000次迭代之后,随机算子没有生成[-1000-1000]范围内的值。对于花车来说同样的事情,多头。等,...
您能解释一下随机运算符在Java中的表现吗?当我们考虑Java类型的所有可能值时,为什么生成的值总是很高?
提前致谢。
答案 0 :(得分: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]
请注意,在谈到浮点数时,每个浮点数的理论概率为~1 /(2 * MAX)〜= 14.7%。
正如您所看到的,同一范围内的“接近0”和“接近MAX”在其范围内产生的变量经验数相似。