Java ThreadLocalRandom.current()。nextGaussian()是否有限制?

时间:2017-05-11 21:08:17

标签: java random java-8 limit gaussian

我正在编写一些软件,需要生成通常分布在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值。但是,如果有一个(观察到的)1亿分之一的机会超过6.0,那么如果强制执行限制,这似乎仍然可以解决我的问题。

1 个答案:

答案 0 :(得分:1)

nextGaussian()可以返回任何可以由double数据类型表示的值。高斯分布接近但两侧从未达到0。因此理论上可以获得Double.MAX_VALUE的值,但不太可能。

高斯分布如下所示: enter image description herehttp://hyperphysics.phy-astr.gsu.edu/hbase/Math/gaufcn.html

分布延伸到正无穷大,因此理论上没有绝对限制。由于我们在VM中运行,并且nextGaussian()返回double,因此我们受到double可以表示的幅度和精度的限制。