/****************************/ /* 一様分布の計算 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> /****************************************/ /* 一様分布の計算(P(X = x), P(X < x)) */ /* x : データ */ /* a,b : 区間 */ /* pr : P(X = x) */ /* return : P(X < x) */ /****************************************/ #include <math.h> double uniform(double x, double a, double b, double *pr) { double f = 0.0, y; 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 */ /********/ int main() { double a, b, x, pr, f, h, p; int sw; char file1[100], file2[100]; FILE *out1, *out2; printf("下限(a)は? "); scanf("%lf", &a); printf("上限(b)は? "); scanf("%lf", &b); printf("目的とする結果は? \n"); printf(" =0 : 確率の計算( P(X = x) 及び P(X < x) の値)\n"); printf(" =1 : p%値( P(X > u) = 0.01p となるuの値) "); scanf("%d", &sw); if (sw == 0) { printf("グラフ出力?(=1: yes, =0: no) "); scanf("%d", &sw); // 密度関数と分布関数の値 if (sw == 0) { printf(" データは? "); scanf("%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(" 密度関数のファイル名は? "); scanf("%s", file1); printf(" 分布関数のファイル名は? "); scanf("%s", file2); out1 = fopen(file1,"w"); out2 = fopen(file2,"w"); printf(" 刻み幅は? "); scanf("%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); fprintf(out1, "%f %f\n", x, pr); fprintf(out2, "%f %f\n", x, f); } } } // %値 else { printf("%の値は? "); scanf("%lf", &x); p = 0.01 * x; f = b - p * (b - a); printf("%f%値 = %f (区間 [%f, %f])\n", x, f, a, b); } return 0; }