为什么 java 中的随机函数总是产生高值?
Why the random function in java is always generating high values?
我正在 java 中实现一个测试数据生成器,用于为 java 基本类型生成随机值。
可能参数值的范围不受限制。例如,如果我想生成一个随机整数或浮点数,我将考虑所有可能的值 (MAX_INT-MIN_INT)。为此,我使用了类似 :
的东西
- Random().nextInt()
- Random().nextLong()
- Random().nextFloat()*Float.MAX_VALUE
- 随机().nextDouble()*Double.MAX_VALUE
- 等等...
但是,这样做,我注意到生成的值总是很高(接近参数类型的最大值和最小值)。例如,在 100000 次迭代之后,随机运算符没有生成 [-1000 - 1000] 范围内的值。花车,多头也是如此。等等,...
你能解释一下随机运算符在 Java 中的表现吗?当我们考虑 Java 类型的所有可能值时,为什么生成的值总是很高?
提前致谢。
你对"high"和"low"的理解是错误的。
单个值(假设均匀分布)在[-1000,1000]
中的概率为2001/(MAX_INT-MIN_INT)
,约为0.00000046。
这个概率极小,因此"small"变量的预期数量也会很小。
事实上,在 [MIN_INT,MAX_INT]
上的均匀分布中,大约一半的元素为正,一半为负。
同样,只有四分之一会在 0
到 MAX_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" 在其范围内产生的变量的经验数量相似。
我正在 java 中实现一个测试数据生成器,用于为 java 基本类型生成随机值。 可能参数值的范围不受限制。例如,如果我想生成一个随机整数或浮点数,我将考虑所有可能的值 (MAX_INT-MIN_INT)。为此,我使用了类似 :
的东西- Random().nextInt()
- Random().nextLong()
- Random().nextFloat()*Float.MAX_VALUE
- 随机().nextDouble()*Double.MAX_VALUE
- 等等...
但是,这样做,我注意到生成的值总是很高(接近参数类型的最大值和最小值)。例如,在 100000 次迭代之后,随机运算符没有生成 [-1000 - 1000] 范围内的值。花车,多头也是如此。等等,...
你能解释一下随机运算符在 Java 中的表现吗?当我们考虑 Java 类型的所有可能值时,为什么生成的值总是很高?
提前致谢。
你对"high"和"low"的理解是错误的。
单个值(假设均匀分布)在[-1000,1000]
中的概率为2001/(MAX_INT-MIN_INT)
,约为0.00000046。
这个概率极小,因此"small"变量的预期数量也会很小。
事实上,在 [MIN_INT,MAX_INT]
上的均匀分布中,大约一半的元素为正,一半为负。
同样,只有四分之一会在 0
到 MAX_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" 在其范围内产生的变量的经验数量相似。