サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−