乱数は, ゲームの他, シミュレーションや数値計算に利用できる. C 言語では, 次のような関数や定数を通じて乱数を利用できる.
例題 9.1
擬似乱数の種を入力し, 擬似乱数の最大値 (RAND_MAX) を出力した後,
その種に基づく擬似乱数を10個発生させるプログラムを作成せよ.
ex91.c |
---|
#include <stdio.h> #include <stdlib.h> /* 乱数を使うときには stdlib.h が必要 */ int main( void ) { int i, seed, r; /* 乱数の最大値の出力 */ printf("RAND_MAX = %d¥n", RAND_MAX); /* 乱数の「種」の設定 */ printf("乱数の種となる整数を入力して下さい > "); scanf("%d",&seed); srand(seed); /* 乱数を 10 回発生させて出力 */ for (i=0; i<10; i++) { r = rand(); printf("%d¥n", r); } return 0; } |
課題 9.1 例題 9.1 のプログラムをコンパイルして実行し, 次を確認せよ (結果をレポートに手短にまとめよ).
例題 9.2 0〜9 の乱数を 100 個発生させるプログラムを作成せよ.
ex92.c |
---|
#include <stdio.h> #include <stdlib.h> /* 乱数を使うときには stdlib.h が必要 */ int main( void ) { int i, r; for (i=0; i<100; i++) { r = rand() % 10; printf(" %d", r); } printf("¥n"); return 0; } |
課題 9.2 自然数 k を入力し, 1 〜 k の乱数を 20 個発生するプログラム irand.c を作成せよ.
課題 9.3 自然数 n を入力し, 区間 [0,1] の実数の乱数を n 個発生するプログラム frand.c を作成せよ.
乱数を用いて積分を行うことができる. モンテカルロ法と呼ばれ, 解析的に求められない定積分を計算計算するのに用いられる.
例題 9.4
0≤x≤1, 0≤y≤1 なる座標 (x,y) を乱数により100万回発生させ,
これが x2+y2≤1 を満たしている確率を求めよ.
これは単位円の 1/4 の面積に相当するので (図を書いて考えてみよ),
これを 4 倍することにより, 円周率を求めることができる.
ex93.c |
---|
#include <stdio.h> #include <stdlib.h> int main(void) { int n_trial = 1000000; int n_inside; int i; double x, y; double r; double pi; n_inside = 0; for (i=0; i<n_trial; i++) { x = (double) rand()/RAND_MAX; y = (double) rand()/RAND_MAX; if (x*x+y*y<=1) { n_inside++; } } r = (double) n_inside/n_trial; printf("r = %g¥n", r); pi = 4 * r; printf("pi = %g¥n", pi); return 0; } |
実行例
$ ./a r = 0.785524 pi = 3.1421 |
課題 9.4
関数 y = √x (x の平方根) の区間 [0,1] の定積分を乱数を用いて求めるプログラム
integral.c を作成せよ.
解析的に求めた結果との比較をレポートに記せ.
画像が出せないのでつまらないが, 工夫次第でそれなりのゲームが作れる.
課題 9.5 下記のプログラムの概形と指示に従って, 次のようなゲームのプログラム dice.c 作成せよ.
#include <stdio.h> #include <stdlib.h> int main( void ) { int my_money = 10; /* 所持金 (初期値10) */ int i; /* 繰り返しの回数 */ int kakekin; /* 掛金 */ int choice1, choice2; /* 掛ける出目2個 */ int dice; /* サイコロの目 */ for (10回繰り返すか, 所持金が無くなるまで) { /* (注1) */ 所持金の表示; 掛金の入力; 掛ける出目 2 個の入力; printf("%d と %d に %d かけました¥n", choice1, choice2, kakekin); printf("サイコロの目は ...¥n"); sleep(1); /* (注2) */ dice = 1〜6 の乱数; printf("%d です¥n", dice); if (当たり) { 当たったことを表示し, 所持金を計算. } else { 外れたことを表示し, 所持金を計算. } } 終了のメッセージ (適当に); return 0; } |
科目名: コンピュータ演習A 課題: C9 番号: 9999 氏名: 関学 太郎 作成: 20oo年oo月oo日 ------------------------------------------------------------- [課題 9.1] 実行結果は下記の通りである. (Cygwinの実行結果を貼り付ける) 課題で問われていることに答える. ------------------------------------------------------------- [課題 9.2] 〜を作成した. 実行結果は下記の通りである. (Cygwinの実行結果を貼り付ける) 〜で苦労した, 〜を工夫した, 等 ------------------------------------------------------------- ([課題 9.3] 以降も同様) ------------------------------------------------------------- [感想] (今回の課題に関する感想を書く) |