一様分布

<?php

/****************************/
/* 一様分布の計算           */
/*      coded by Y.Suganuma */
/****************************/

/****************************************/
/* 一様分布の計算(P(X = x), P(X < x)) */
/*      x : データ                      */
/*      a,b : 区間                      */
/*      pr : P(X = x)                   */
/*      return : P(X < x)               */
/****************************************/
function uniform($x, $a, $b, &$pr)
{
	$f = 0.0;

	if ($x < $a) {
		$pr = 0.0;
		$f  = 0.0;
	}
	else if ($x > $b) {
		$pr = 0.0;
		$f  = 1.0;
	}
	else {
		$y  = 1.0 / ($b - $a);
		$pr = $y;
		$f  = $y * ($x - $a);
	}

	return $f;
}

/********/
/* main */
/********/

	printf("下限(a)は? ");
	fscanf(STDIN, "%lf", $a);
	printf("上限(b)は? ");
	fscanf(STDIN, "%lf", $b);
	printf("目的とする結果は? \n");
	printf("     =0 : 確率の計算( P(X = x) 及び P(X < x) の値)\n");
	printf("     =1 : p%値( P(X > u) = 0.01p となるuの値) ");
	fscanf(STDIN, "%d", $sw);

	if ($sw == 0) {

		printf("グラフ出力?(=1: yes,  =0: no) ");
		fscanf(STDIN, "%d", $sw);
					// 密度関数と分布関数の値
		if ($sw == 0) {
			printf("   データは? ");
			fscanf(STDIN, "%lf", $x);
			$f = uniform($x, $a, $b, $pr);
			printf("P(X = %f) = %f,  P( X < %f) = %f (区間 [%f, %f])\n", $x, $pr, $x, $f, $a, $b);
		}
					// グラフ出力
		else {
			printf("   密度関数のファイル名は? ");
			fscanf(STDIN, "%s", $file1);
			printf("   分布関数のファイル名は? ");
			fscanf(STDIN, "%s", $file2);
			$out1 = fopen($file1,"wb");
			$out2 = fopen($file2,"wb");
			printf("   刻み幅は? ");
			fscanf(STDIN, "%lf", $h);
			for ($x = $a; $x < $b+0.5*$h; $x += $h) {
				if ($x > $b-0.5*$h && $x < $b+0.5*$h)
					$x = $b;
				$f = uniform($x, $a, $b, $pr);
				fwrite($out1, $x." ".$pr."\n");
				fwrite($out2, $x." ".$f."\n");
			}
		}
	}
					// %値
	else {
		printf("%の値は? ");
		fscanf(STDIN, "%lf", $x);
		$p = 0.01 * $x;
		$f = $b - $p * ($b - $a);
		printf("%f%値 = %f (区間 [%f, %f])\n", $x, $f, $a, $b);
	}

?>