//正态分布函数,从三种生成法中随机选择一种,更加随机 public class Normal { public Normal() { }
public double normalRandom1(double a, double b) {//注意这里的b是方差,等于标准差的平方 double temp = 12; double x = 0; for (int i = 0; i < temp; i++) x = x + (Math.random()); x = (x - temp / 2) / (Math.sqrt(temp / 12)); x = a + x * Math.sqrt(b); return x; }
public double normalRandom2(double a, double b) { double pi = 3.1415926535; double r1 = Math.random(); Math.random(); Math.random(); Math.random(); Math.random(); Math.random(); Math.random(); Math.random(); double r2 = Math.random(); double u = Math.sqrt((-2) * Math.log(r1)) * Math.cos(2 * pi * r2); double z = a + u * Math.sqrt(b); return (z); }
public double normalRandom3(double a, double b) { double f = 0; double c0 = 2.515517, c1 = 0.802853, c2 = 0.010328; double d1 = 1.432788, d2 = 0.189269, d3 = 0.001308; double w; double r = Math.random(); if (r <= 0.5) w = r; else w = 1 - r; if ((r - 0.5) > 0) f = 1; else if ((r - 0.5) < 0) f = -1; double y = Math.sqrt((-2) * Math.log(w)); double x = f * (y - (c0 + c1 * y + c2 * y * y) / (1 + d1 * y + d2 * y * y + d3 * y * y * y)); double z = a + x * Math.sqrt(b); return (z); }
//然后判断用哪个正态分布随机数函数的方法如下: public double normalRandom(double a, double b) { double r = Math.random() * 9; switch ((int) r / 3) { case 0: return normalRandom1(a, b); case 1: return normalRandom2(a, b); case 2: return normalRandom3(a, b); } return 0.0; } }