<?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;
}
?>