可以使用共享的Random实例来获得高斯分布

时间:2013-12-25 09:59:31

标签: java random gaussian

在java类中,有两个方法共享的随机实例。

public class Utils{
    Random rand = new Random();

    public double nextGaussian1(){
          return rand.nextGaussian();
    }

    public double nextGaussian2(){
          return rand.nextGaussian();
    }   
}

我是否只能使用一个Random实例来获取2种方法的高斯分布?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用Random的一个实例。 nextGaussian()的支持实施是Box,Muller和& Marsaglia的Polar方法成对生成高斯。第一次调用它将生成一对并返回两个值中的第一个,下一个调用将返回先前生成的第二个值。如果均匀输入,那么这些对在数学上是独立的(*)。理论上,如果制服来自具有不良晶格结构的线性同余发生器,这可能是一个问题,但Java的LCG相当不错,实际上结果可以被认为是大多数用途的独立。

更大的问题是为什么你需要两种不同的方法来成为高斯的来源?只要调用rand.nextGaussian()就无法实现,这会让你获得什么?

(*) - 高斯返回值是正弦和&在极坐标中生成的矢量的余弦分量,因此是正交的。对于高斯人来说,正交性意味着独立。

答案 1 :(得分:0)

如果这两个方法是随机调用的,那么这很好,但是如果你按照下面这样的模式调用它们,那么它将无法正常工作,因为它会生成高斯数对

for(int i = 0; i < 100; i++ ) {
    values1[i] = Utils.nextGaussian1();
    values2[i] = Utils.nextGaussian2();
}

这与

相同
Random rand = new Random();
for(int i = 0; i < 100; i++ ) {
    values1[i] = rand.nextGaussian();
    values2[i] = rand.nextGaussian();
}

BTW制作实用程序类的一种简单方法是使用没有实例的enum

public enum Utils {;
     // class is final with a private constructor

     public static double nextGaussian() {
          return random.nextGaussian();
     }
}