Java ThreadLocalRandom.current().nextGaussian() 有极限吗?
Does Java ThreadLocalRandom.current().nextGaussian() have a limit?
我正在编写一些需要生成随机数的软件,这些随机数通常分布在 0 左右,但具有可靠的已知限制 +/- 10。
考虑以下 Java 8 代码:
int floorMax = 10;
int totalRuns = 1000000000;
int[] floorCounts = new int[floorMax+1];
for (int i = 0; i < totalRuns; i++)
floorCounts[
(int) Math.floor(Math.abs(
ThreadLocalRandom.current().nextGaussian()
))
]++;
for (int c = 0; c < floorMax; c++)
System.out.println(
"# of values between " + String.valueOf(c) +
" and " + String.valueOf(c + 1) +
": " + floorCounts[c]);
它在 42 秒内在我的本地机器上执行:
# of values between 0 and 1: 682679980
# of values between 1 and 2: 271828237
# of values between 2 and 3: 42795770
# of values between 3 and 4: 2633149
# of values between 4 and 5: 62319
# of values between 5 and 6: 544
# of values between 6 and 7: 1
# of values between 7 and 8: 0
除了Java double
值的明显硬限制外,nextGaussian() 是否有限制?由于这是由随机噪声产生的,我假设 nextGaussian() 的输出可以是任何 double
值。但是,(观察到的)1000000000 分之一的机会高于 6.0,如果强制执行限制,这似乎仍然是解决我的问题的有用方法。
nextGaussian()
可以 return 可以用双精度数据类型表示的任何值。高斯分布逼近但永远不会在任何一侧达到 0。所以理论上可以得到Double.MAX_VALUE
的值,但可能性很小。
高斯分布如下所示:
(http://hyperphysics.phy-astr.gsu.edu/hbase/Math/gaufcn.html)
分布延伸到正负无穷大,所以理论上没有绝对限制。由于我们在 VM 中 运行,并且 nextGaussian()
return 是 double
,因此我们受限于 double
可以表示的大小和精度。
我正在编写一些需要生成随机数的软件,这些随机数通常分布在 0 左右,但具有可靠的已知限制 +/- 10。
考虑以下 Java 8 代码:
int floorMax = 10;
int totalRuns = 1000000000;
int[] floorCounts = new int[floorMax+1];
for (int i = 0; i < totalRuns; i++)
floorCounts[
(int) Math.floor(Math.abs(
ThreadLocalRandom.current().nextGaussian()
))
]++;
for (int c = 0; c < floorMax; c++)
System.out.println(
"# of values between " + String.valueOf(c) +
" and " + String.valueOf(c + 1) +
": " + floorCounts[c]);
它在 42 秒内在我的本地机器上执行:
# of values between 0 and 1: 682679980
# of values between 1 and 2: 271828237
# of values between 2 and 3: 42795770
# of values between 3 and 4: 2633149
# of values between 4 and 5: 62319
# of values between 5 and 6: 544
# of values between 6 and 7: 1
# of values between 7 and 8: 0
除了Java double
值的明显硬限制外,nextGaussian() 是否有限制?由于这是由随机噪声产生的,我假设 nextGaussian() 的输出可以是任何 double
值。但是,(观察到的)1000000000 分之一的机会高于 6.0,如果强制执行限制,这似乎仍然是解决我的问题的有用方法。
nextGaussian()
可以 return 可以用双精度数据类型表示的任何值。高斯分布逼近但永远不会在任何一侧达到 0。所以理论上可以得到Double.MAX_VALUE
的值,但可能性很小。
高斯分布如下所示:
分布延伸到正负无穷大,所以理论上没有绝对限制。由于我们在 VM 中 运行,并且 nextGaussian()
return 是 double
,因此我们受限于 double
可以表示的大小和精度。