サイトマップ / C言語講座出入り口総目次目次:時刻と時間>コンピュータの時計

青い直線

コンピュータの時計

青い直線

[起動後の経過時間]←このソース→[現在の年月日と時刻]

/* 今日は乱数を発生させる関数について学び、それを使って円周率の近似値を求めます。乱数を発生させる標準ライブラリ関数を示します。

    #include <stdlib.h>
    int rand(void);

    例:n = rand(  );

    戻り値    0 から 32767 の範囲の整数の乱数

この関数は上記の範囲の整数の乱数を返します。常に同じ系列の乱数を発生させます。発生系列を変えるには、次の関数を呼び出して、乱数のシード ( 種 ) を変えます。

    #include <stdlib.h>
    void srand(unsigned int seed);

    例:srand(seed);

    戻り値 なし

seed には、適当な値をいれます。よく行われるのは、現在の時間を入れます。 */

/* コンピュータの時計 */

/* コンピュータは時計を持っています。ある年月日のある時刻からの経過時間で、単位は秒です。時間を取得するには次の関数を使います。

    #include <time.h>
    time_t time(time_t *time);

    例:time(&time);

    戻り値 ある時点からの経過時間

time_t は、time.h の中で、次のように型が定義されています。

    typedef long time_t;

time_t の型の実体は、処理系によって違うものがあります。

srand( ) の引数は unsigned int 型の整数です。time( ) の戻り値は long 型の整数です。戻り値をそのままsrand( ) の引数として使うことはできません。値がオーバーフローしてしまいます。そこで、time( ) の戻り値をunsigned int 型の最大値で割ったものを、引数として使います。

unsigned int 型の最大値はインクルードファイル limits.h の記号定数 UINT_MAX に入っているので、これをインクルードして使います。 */

/* ソースプログラムの説明 */

/* コンピュータで円周率を計算する方法は、幾つかあります。今回採用した、円周率の近似値の求め方について説明します。半径1の円の面積は円周率になります。半径1の円の円周上にある点は、次の式を満たします。

    x * x + y * y = 1

円周の中の点は、次の式を満たします。

    x * x + y * y < 1

x と y の取りうる値は、-1から1ですが、ここでは、座標の第1象限だけを考えます。 そうすると、x と y の取りうる値は、0から1です。0から1までの値を取る乱数を二つ発生させ、それを x と y に代入し、上記の関係を満たすかどうか調べて ( count1 )、満たす場合をカウントして ( count2 )、count2 / count1 を計算すれば、第1象限を占める円の面積が出ます。これを4倍すれば、半径1の円の面積、即ち、円周率がでます。

今回は、10000000 回 ( COUNT_MAX ) 乱数の組を発生させ、100000 回ごとにその結果を表示しています。実行に時間がかかり過ぎるようならば、これらの値を減らして下さい。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <stdlib.h>   /* srand(  ) と rand(  ) で使用 */
#include <time.h>     /* RAND_MAX と time(  ) で使用 */
#include <limits.h>   /* UINT_MAX が定義されている */

#define COUNT_MAX 10000000  /* 10000000 回 計算をする */
void main(void);

void main(void)
{
    time_t seed;
    double x, y;
    unsigned long count1, count2 = 0L;

    time(&seed);
    srand(seed % UINT_MAX);    /* unsigned int 型の最大値で割る */

    for (count1 = 1L; count1 <= COUNT_MAX; count1++) {

        x = (double)rand( ) / RAND_MAX;  /* 0から1の乱数を発生 */
        y = (double)rand( ) / RAND_MAX;  /* 0から1の乱数を発生 */

        if ((x * x + y * y) <= 1.0)      /* 円の中なら */
            count2++;                    /* カウントする */

        if (!(count1 % 100000))          /* 100000 回ごとに結果を表示 */
            printf("%8.0ld\t%10.7lf\n", count1, ((double)count2 / (double)count1) * 4.0);
    }
}

/* ここまでソースプログラム */

[起動後の経過時間]←このソース→[現在の年月日と時刻]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:時刻と時間>コンピュータの時計