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