<?php /****************************/ /* 乱数の発生 */ /* coded by Y.Suganuma */ /****************************/ printf("乱数の初期値を入力してください "); fscanf(STDIN, "%lf", $seed); mt_srand($seed); // 乱数の初期設定 // mt_srand(); // 初期値もランダムにしたい場合 /* [a b] 区間の一様乱数 */ $mean = 0.0; $sd = 0.0; $a = 2.0; $b = 4.0; $n = 10000; for ($i1 = 0; $i1 < $n; $i1++) { $r = $a + ($b - $a) * unifm_d(); $mean += $r; $sd += $r * $r; } $mean = $mean / $n; $sd = sqrt(abs($n /($n - 1.0) * ($sd / $n - $mean * $mean))); printf("一様分布\n"); printf(" 平均 %f 標準偏差 %f\n", $mean, $sd); /* 平均 m の指数分布 */ $mean = 0.0; $sd = 0.0; $m = 0.5; for ($i1 = 0; $i1 < $n; $i1++) { $r = exp_d($m); $mean += $r; $sd += $r * $r; } $mean = $mean / $n; $sd = sqrt(abs($n /($n - 1.0) * ($sd / $n - $mean * $mean))); printf("指数分布\n"); printf(" 平均 %f 標準偏差 %f\n", $mean, $sd); /* 標準正規分布 */ $mean = 0.0; $sd = 0.0; for ($i1 = 0; $i1 < $n; $i1++) { $r = norm_d(0.0, 1.0); $mean += $r; $sd += $r * $r; } $mean = $mean / $n; $sd = sqrt(abs($n /($n - 1.0) * ($sd / $n - $mean * $mean))); printf("標準正規分布\n"); printf(" 平均 %f 標準偏差 %f\n", $mean, $sd); /******************************/ /* [0, 1]区間の一様乱数の発生 */ /* rerutn : 乱数 */ /******************************/ function unifm_d() { return mt_rand() / mt_getrandmax(); } /*****************************/ /* 平均値 m の指数乱数の発生 */ /* m : 平均 */ /*****************************/ function exp_d($m) { return -$m * log(unifm_d()); } /***********************************/ /* 正規分布変量の発生 */ /* m : 平均 */ /* s : 標準偏差 */ /* return : 正規分布変量 */ /***********************************/ function norm_d($m, $s) { $x = 0.0; for ($i1 = 0; $i1 < 12; $i1++) $x += unifm_d(); $x = $s * ($x - 6.0) + $m; return $x; } ?>