Java ThreadLocalRandom.current().nextGaussian() 有限制吗?

问题描述 投票:0回答:1

我正在编写一些软件,需要生成通常分布在 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
值。然而,(观察到)超过 6.0 的几率为 1000000000 分之一,如果强制执行限制,这似乎仍然是解决我的问题的有用解决方案。

java random limit gaussian
1个回答
3
投票

nextGaussian()
可以返回任何可以用 double 数据类型表示的值。高斯分布两边接近但永远不会达到 0。所以理论上有可能得到
Double.MAX_VALUE
的值,但可能性很小。

高斯分布如下所示: (http://hyperphysicals.phy-astr.gsu.edu/hbase/Math/gaufcn.html)

分布延伸至正无穷大和负无穷大,因此理论上没有绝对极限。由于我们在虚拟机中运行,并且

nextGaussian()
返回
double
,因此我们受到
double
可以表示的大小和精度的限制。

© www.soinside.com 2019 - 2024. All rights reserved.