#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
double random_float(double, double);
double rndcos(void);
#define MTIME 10
#define TIMES 20000

main()
{
    int i,k;
    int ctime = 0; /*交わった回数*/
    int ntime = TIMES;     /*試行回数*/
    double ylength;/*針の，線の垂直方向に対する射影の半分の長さ*/
    double y;      /*針の中心から最も近い線までの距離*/
    double p;      /*交わった確率*/
    double l;      /*線の間隔*/

    /* Lの入力 */
    printf("value of L: ");
    scanf("%lf",&l);
    srand(time(NULL));
    for(k = 0; k < MTIME; k++){
      /*試行部分*/
      ctime = 0;
      for(i = 0; i < ntime; i++)
        {
          /*yとylengthの値をランダムに生成し，ylength >= y ならば交わる*/
          y = random_float(0.0, l/2);
          ylength = l/2*fabs(rndcos());
          if(ylength >= y) ctime++;
        }
      /*交わった確率を計算して円周率を出力*/
      p = (double)ctime/ntime;
      printf("value of pi: %1.10f\n", 2/p);
    }
    return(0);
}

/* minとmaxの間の実数乱数を発生する関数 */
double random_float(double min, double max)
{
    return min + ((max-min)*rand())/RAND_MAX;
}

/*ランダムなxに対応したcos(x)の値を返す関数*/
double rndcos(void)
{
    double x1,y1,x2,y2;
    double cos;
    x1 = random_float(0.0, 1.0);
    y1 = random_float(0.0, 1.0);
    x2 = random_float(0.0, 1.0);
    y2 = random_float(0.0, 1.0);
    cos = (x1-x2)/sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
    return(cos);
}
