/*************************/ /* 乱数の発生 */ /* coded Y.Suganuma */ /*************************/ import java.io.*; import java.util.Random; public class Test { public static void main(String args[]) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); double a, b, m, r, mean, sd; int i1, n = 10000, seed; System.out.print("乱数の初期値を入力してください "); seed = Integer.parseInt(in.readLine()); Ransu rn = new Ransu(seed); // 乱数の初期設定 /* [a b] 区間の一様乱数 */ mean = 0.0; sd = 0.0; a = 2.0; b = 4.0; for (i1 = 0; i1 < n; i1++) { r = a + (b - a) * rn.unifm_d(); mean += r; sd += r * r; } mean = mean / n; sd = Math.sqrt(Math.abs(n /(n - 1.0) * (sd / n - mean * mean))); System.out.println("一様分布"); System.out.println(" 平均 " + mean + " 標準偏差 " + sd); /* 平均 m の指数分布 */ mean = 0.0; sd = 0.0; m = 0.5; for (i1 = 0; i1 < n; i1++) { r = rn.exp_d(m); mean += r; sd += r * r; } mean = mean / n; sd = Math.sqrt(Math.abs(n /(n - 1.0) * (sd / n - mean * mean))); System.out.println("指数分布"); System.out.println(" 平均 " + mean + " 標準偏差 " + sd); /* 標準正規分布 */ mean = 0.0; sd = 0.0; for (i1 = 0; i1 < n; i1++) { r = rn.norm_d(0.0, 1.0); mean += r; sd += r * r; } mean = mean / n; sd = Math.sqrt(Math.abs(n /(n - 1.0) * (sd / n - mean * mean))); System.out.println("標準正規分布"); System.out.println(" 平均 " + mean + " 標準偏差 " + sd); } } /********************/ /* 様々な乱数の発生 */ /********************/ class Ransu { private Random rand; // コンストラクタ Ransu (int seed) { rand = new Random(seed); } /******************************/ /* [0, 1]区間の一様乱数の発生 */ /* rerutn : 乱数 */ /******************************/ double unifm_d() { return rand.nextDouble(); } /*****************************/ /* 平均値 m の指数乱数の発生 */ /* m : 平均 */ /*****************************/ double exp_d(double m) { return -m * Math.log(rand.nextDouble()); } /***********************************/ /* 正規分布変量の発生 */ /* m : 平均 */ /* s : 標準偏差 */ /* return : 正規分布変量 */ /***********************************/ double norm_d(double m, double s) { double x; int i1; x = 0.0; for (i1 = 0; i1 < 12; i1++) x += rand.nextDouble(); x = s * (x - 6.0) + m; return x; } }