nextGaussian()起什么作用?nextGaussian()方法Returns:
the next pseudorandom, Gaussian ("normally") distributed double value with mean 0.0 and standard deviation 1.0 from this random number generator's sequence.javadoc中做上述描述,生成的数值符合均值为0标准差为1的高斯/正态分布,那么,如果循环输出nextGaussian()值的话,这些值间有什么联系吗?如下代码:
  Random r = new Random();
  for(int i=0; i<100; i++)
      System.out.println(r.nextGaussian());我把打印出来的100个值copy到excel中做折线图,发现图像并不符合正态/高斯分布,而且,里面有很负数,均值为0标准差为1的高斯/正态分布函数是得不出来负数的。所以,我搞不懂nextGaussian()方法到底是做什么用的。我想做的事情是得到一组符合高斯/正态分布的随机数,是否可以利用nextGaussian方法,高手请指教,谢谢!

解决方案 »

  1.   

    synchronized public double nextGaussian() {
        if (haveNextNextGaussian) {
                haveNextNextGaussian = false;
                return nextNextGaussian;
        } else {
                double v1, v2, s;
                do { 
                        v1 = 2 * nextDouble() - 1;   // between -1.0 and 1.0
                        v2 = 2 * nextDouble() - 1;   // between -1.0 and 1.0
                        s = v1 * v1 + v2 * v2;
                } while (s >= 1 || s == 0);
                double multiplier = Math.sqrt(-2 * Math.log(s)/s);
                nextNextGaussian = v2 * multiplier;
                haveNextNextGaussian = true;
                return v1 * multiplier;
        }
     }
    每用过 但是刚刚查到 这是该函数的实现代码 LZ参考一下
      

  2.   

    多谢楼上!我把正态分布和正态分布密度函数弄混了。我从密度函数表达式,就想当然认为正态分布没有负数了。您对Zipf(偏度分布)有了解吗?有没有好的方法,生成一组符合Zipf分布的随机数?呵呵,问题好像越界了,谢谢!
      

  3.   

    调用nextGaussian()输出的数值是什么含义?比如0.3634161027622056,是指概率密度函数在某个区间内的积分值吗?
      

  4.   

    不好意思,我对 Zipf 不了解。根据 tdy1234 提供的 Java 实现来看,不像是积分值,正态分布的积分函数好像并不能用普通的函数来表示的。这些数应该就只是一个通过 nextDouble() 再进行些特定的数学运算得出的随机数而已,并没有其特定的含义,只有大量的这些数据才符合高斯分布。
      

  5.   

    import java.util.Map;
    import java.util.Random;
    import java.util.TreeMap;public class Test {
      public static void main(String[] args) throws IOException {
        Map<Double, Integer> map = new TreeMap<Double, Integer>();    
        Random r = new Random();
        for(int i=0; i<10000; i++){
          double gau = r.nextGaussian();
          double gauKey = Math.round(gau*10)/10.0;
          int n = (map.get(gauKey)==null)?0:map.get(gauKey);
          map.put(gauKey, n+1);
        }    
        for(Map.Entry entry : map.entrySet()) {
          System.out.printf("%f %d%n", entry.getKey(), entry.getValue());
        }
      }
    }这段程序的输出结果是根据 getGaussian() 以 0.1 区间分组的输出,把输出以空格为间隔粘到 Excel 中,在 Excel 中算出第二列数值的比重,再使用“XY散点图”就可以生成图形了。