乱数の発生

/*************************/
/* 乱数の発生            */
/*      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;
	}
}