在java类中,有两个方法共享的随机实例。
public class Utils{
Random rand = new Random();
public double nextGaussian1(){
return rand.nextGaussian();
}
public double nextGaussian2(){
return rand.nextGaussian();
}
}
我是否只能使用一个Random实例来获取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();
}
}