求教Random类的nextGaussian方法

mercurius 2007-06-27 09:45:48
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方法,高手请指教,谢谢!
...全文
1396 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mercurius 2007-06-27
  • 打赏
  • 举报
回复
非常感谢!
  • 打赏
  • 举报
回复
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散点图”就可以生成图形了。
  • 打赏
  • 举报
回复
不好意思,我对 Zipf 不了解。

根据 tdy1234 提供的 Java 实现来看,不像是积分值,正态分布的积分函数好像并不能用普通的函数来表示的。这些数应该就只是一个通过 nextDouble() 再进行些特定的数学运算得出的随机数而已,并没有其特定的含义,只有大量的这些数据才符合高斯分布。
mercurius 2007-06-27
  • 打赏
  • 举报
回复
调用nextGaussian()输出的数值是什么含义?比如0.3634161027622056,是指概率密度函数在某个区间内的积分值吗?
mercurius 2007-06-27
  • 打赏
  • 举报
回复
多谢楼上!

我把正态分布和正态分布密度函数弄混了。我从密度函数表达式,就想当然认为正态分布没有负数了。

您对Zipf(偏度分布)有了解吗?有没有好的方法,生成一组符合Zipf分布的随机数?呵呵,问题好像越界了,谢谢!
  • 打赏
  • 举报
回复
另:你想得到一组符合正态分布的随机数的话,完全可以使用这一方法,应该很难再找到其他的方法了。这个方法产生的数值是符合标准正态分布的。
  • 打赏
  • 举报
回复
正态分布图是指分布范围的概念,需要根据生成的随机数进行分组,再根据分组所占的百分数来进行统计进行作图的,这样作出来的图才是正态分布图。如果使用很多随机数的话,可以算出其均值为0的,即在越靠0的数,其分布范围越多。

要使用这个随机数产生的数字来作图的话,需要根据区间来分组,比如 ...,-1.5~-0.5,-0.5~0.5,0.5~1.5,... ,再求出这些数字在这些组中的数量和所占比重,再使用条形图进行作图的,这样作出来的图才是标准正态分布图。当然了,数据越多,区间划分越线,其条形图越标准。

=====================================================
均值为0标准差为1的高斯/正态分布函数是得不出来负数的。
——引自楼主
=====================================================
如果没有负数,那么它的均值怎么可能为0呢?
tdy1234 2007-06-27
  • 打赏
  • 举报
回复
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参考一下

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧