乱数は, ゲームの他, シミュレーションや数値計算に利用できる. 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] 以降も同様) ------------------------------------------------------------- [感想] (今回の課題に関する感想を書く) |