乱数の発生

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