#include <stdio.h> #include <stdlib.h> #include <time.h> main() { srand((unsigned) time(NULL)); int dice = rand() % 6 + 1; printf("%d\n", dice); return(0); } |
標準のヘッダファイルに加えて,以下の2つをインクルードする必要があります ので,必ず記入しておいてください.
#include <stdlib.h> #include <time.h> |
乱数は一度作られるとその順番が決まってしまいます.そこで,実行する度にそ の順番をシャッフルしないといけません.そのための命令を最初に書いておきま す.これは一つのプログラムの中に1回あればそれで構いません.
srand((unsigned) time(NULL)); |
今の時点で意味は分からないとは思いますが,unsigned とは符号無し の数(正の数)で,コンピュータ内の時計を利用して毎回違う数字を発生させるた めに,時間の関数である time を使っています.
乱数は以下の関数で発生させられます.
rand(); |
「関数」というのは,C言語では名前に括弧 () をつけて表現されるもので,それを命令で呼び出すと「値」を返してくれるものです.括弧の中はこの rand() や main() のように空欄のままのものや printf のように括弧の中に式や文字がある場合とがあります.rand() は呼び出される度に発生させた乱数の値が返されます.ただし,rand() だけだと発生する乱数は扱える最大の桁の整数になってしまいます.次の例で試してみましょう.
printf("%d\n", rand()); |
そこで以下に示すように剰余を使用して範囲を限定します.
例えば,サイコロの目ですと全部で6種類なので6で割った余りを活用します.注 意するのは6で割った余りは0から5までなので,サイコロにするには1を加えて1 から6にする必要があることです.そこで,先ほどの例のようになるわけです.
rand() % 6 + 1; |
関数 rand() で発生させた値を後で再び計算などに使用するためには,変数に 代入しておく必要があります.例えば,変数 num に代入するときには,
int num; num = rand(); |
のようにしておくことで後々乱数の値を利用できます.
以下に示す演算を行って,整数型の演算結果を確かめて理解を深めましょう.単純に printf の括弧の中に入れて試すので構いません.
1 / 3
2 / 3
4 / 3
1 % 3
2 % 3
4 % 3
10 % 5
2桁の整数を乱数を利用して発生させて表示させましょう.2桁の整数とは10から 99までですので,全部で何種類あるか考えてから準備してください.以下のよう に結果を表示することにしましょう.
Obtained random number: 22 |
表示させるための命令の部分は以下に示すように一度乱数の値を変数に入れてからにしてみましょう.
printf("Obtained random number: %d\n", num); |
二桁の整数を得るもう一つの考え方として,必要な数の最小値と最大値から考えることもできます.二桁の整数の最小のものは10ですが,剰余は割り切れる場合0になる可能性がありますので,
rand() % 何かの数 + 10;
のように最後に10を加える必要があります.また,そうすると,二桁の整数の最大のものは99ですので,10を引いて89まで乱数として出てくるようにしないといけません.余りの最大値が89ということはどんな数で割ればよいでしょうか? これは簡単ですね.
3桁の整数,そして4桁の整数をそれぞれ一つずつ乱数を利用してランダムに表示させるプログラムを作成しましょう.
2から9までの整数を2つ乱数で発生させて,それらの和と差を求めるプログラム を作りましょう.表示は以下のようにしてください.
Obtained random number: 5 and 9 Sum of them: 14 Difference between them: -4 |
-10から10までの整数をどれか一つ乱数で発生させるプログラムを作ってみましょう.
四則演算では無いですが,変数に代入した値を「入れ換える」操作を考えてみま しょう.次に示すプログラムの途中に入れ換えの式を入れて完成してください.
#include <stdio.h> main() { int m, n, tmp; m = 1; n = 2; printf("m = %d and n = %d\n", m, n); |
ここに入れ換えの処理を入れる(全部で3行) |
printf("Exchange the values of m and n\n"); printf("m = %d and n = %d\n", m, n); return(0); } |
m = 1 and n = 2 Exchange the values of m and n m = 2 and n = 1 |
型の宣言のところで,tmp という変数を定義していることに注意してください.この変数は何のために使用するのでしょうか?代入操作をどう組み合わせればよいのか,がポイントです.
乱数を発生させる関数 rand() は整数しか取り扱えません.そこで,実 数の乱数を用意するためには,得られた整数を加工する必要があります.-1から1の 範囲で少数第2位までの実数を乱数で発生させる方法を考えてみましょう.
Obtained random number: -0.49 |