そろそろ、ゲームが作りたいと考えていると思いますが、乱数についてもう少し説明します。
これまで、乱数とはランダムな数という曖昧な表現をしていましたが、以前にも書いたとおり、コンピュータは曖昧を嫌います。
プログラム言語を通じて、コンピュータに指示を出す場合も、曖昧なことは出来ません。
では、何をはっきりとさせれば良いのでしょうか。
それは、乱数の範囲です。
これまでは、適当にランダムな数を発生させてきましたが、ゲーム等で乱数を使うには範囲をはっきりとさせておく必要があります。
例えば、サイコロを作ると考えてみてください。
サイコロは、1〜6の数値しか出ません。
しかし、これまでの実行結果を見てみると、「20000」とか「6000」とか非常に大きな数値が表示されてきました。
これには理由があります。
前回のプログラムの、
#include <stdlib.h>
の上で右クリックしてみてください。
ポップアップメニューが表示されますので、
ドキュメント<stdlib.h>を開く
というメニューを選択してください。
ヘッダファイルを開く
ファイルの中をよく探すと、以下のような記述があります。
#define RAND_MAX 0x7fff
乱数の最大値について定義してあるのですが、「0x7fff」とは16進数の「7fff」のことです。
10進数にしてみると「32767」となります。
つまり、乱数を発生させた場合、(私の環境では)「0〜32767」のどれかの整数が発生するということになります。
しかし、上に書いたようにサイコロでは、こんな広い範囲の数値は必要ありません。
そこで、発生する乱数の範囲をコントロールする必要が出てきます。
どのようにコントロールするかは、「割った余り」が重要になります。
次のサンプルを見てください。
<sample program 023-01>
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int number; srand((unsigned int)time(NULL)); number = rand() % 100; printf("乱数 %d\n", number); return 0; } |
<実行結果>
乱数 88 続行するには何かキーを押してください・・・
※実行した時間によって値は変わります。
何度も実行してみてください。
何度実行しても、「0〜99」までの数値しか表示されないはずです。
ポイントは、「rand() % 100」です。
発生させた乱数の「100で割った余り」を計算しています。
「100で割った余り」は必ず「0〜99」の範囲に収まります。
この「余り」を使って乱数の範囲を限定するのです。
サイコロは「1〜6」の数値がランダムで出てきます。
では、実際にサイコロを作ってみます。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int number; srand((unsigned int)time(NULL)); number = rand() % 6 + 1; printf("乱数 %d\n", number); return 0; } |
<実行結果>
乱数 1 続行するには何かキーを押してください・・・
何度も実行すると、1〜6までの値が表示されることに気づくはずです。
「ある数で割った余り」は、「0〜ある数−1」の範囲を取ります。
「6で割った余り」は「0〜5」の範囲となりますので、その数に1を加算することで「1〜6」の範囲の数値をランダムに発生させることが出来るのです。
乱数が自在に扱えるようになれば、色々なゲームを作ることが出来るようになります。
では、ゲームを作ってみましょう。