「C言語」で「ランダムな値(乱数)」を取得する方法
「C言語」で「ランダム値」を取得する方法を勉強しながら、「ランダム値」を活かしたプログラムの作成に取り組んでいきたいと思います。
「Javascript」でシューティングゲームを作った時のように「ランダム値」を使えるようになると、作成できるプログラムの幅がグッと広がっていきます。
それでは、「C言語」での「ランダム値」の取得方法について学んでいきましょう。
乱数(ランダム値)の取得方法
ランダム値を取得する関数を利用するためには、「stdlib.h」というヘッダーファイルをincludeする必要があります。
この中で定義されているランダム値を取得する関数を利用していくのですが、「rand」関数と「srand」関数があり、まず「rand」関数から見ていきたいと思います。
rand関数
「rand」関数は戻り値が整数なので、どんな値が出るのか、プログラムを書いて出力してみたいと思います。
#include <stdio.h> #include <stdlib.h> int main(void) { printf("rand=%d",rand()); return 0; }
を書いて実行すると、
rand=41
のように表示されます。
しかし、何度やっても同じ出力しかされず、「???」となりました。
「rand」関数について調べてみると、for文などで繰り返すとさまざまな値が出てくるらしい。
#include <stdio.h> #include <stdlib.h> int main(void) { int i; for ( i = 0; i<10; i++ ){ printf("rand=%d\n",rand()); } return 0; }
このプログラムを実行すると、
rand=41 rand=18467 rand=6334 rand=26500 rand=19169 rand=15724 rand=11478 rand=29358 rand=26962 rand=24464
のようにさまざまな値を得ることができますが、毎回同じ並びの値が表示されますので、これだと「ランダムな値」とは言えませんね(^_^;)
srand関数
さらにいろいろと調べていくと、「srand」関数と組み合わせることで、毎回異なるランダムな値を取得できるようになるそうです。
「srand」関数の引数に「seed」と呼ばれる「乱数生成の元になる値」を渡すと、その値を元に「ランダム値」を取得することができます。が・・・
毎回違う「seed」を渡さないと、同じ「乱数」が出てくるので、「時刻」を元にすることが多いそう。
なんかいろいろ複雑で面倒くさかったり。
毎回違うランダムな値を取得するために、この「srand」関数と時刻を取得できる「time」関数を組み合わせるのですが、「time」関数を利用するためには、「time.h」というヘッダーファイルを読み込む必要があります。
プログラムにしてみると、
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i; srand(time(NULL)); for ( i = 0; i<10; i++ ){ printf("rand=%d\n",rand()); } return 0; }
のようになりますが、これを実行すると、
rand=28800 rand=28478 rand=25124 rand=6660 rand=26329 rand=28781 rand=23338 rand=15735 rand=17461 rand=10107
ようになります。もう一回実行してみると、
rand=29097 rand=23543 rand=12364 rand=966 rand=14683 rand=25665 rand=11659 rand=11497 rand=12688 rand=7688
のようになり、異なった「ランダム値」が取得できているのがわかりますね。
ただ、取得できる乱数の範囲は「0」~「RAND_MAX」という範囲でしか取得することができません。
「RAND_MAX」の値は、ランダム値の「最大値」を設定しているのですが、その値は、
#include <stdio.h> #include <stdlib.h> int main(void) { printf("rand max=%d\n",RAND_MAX); return 0; }
のように「RAND_MAX」の値を出力するだけで調べることができます。
rand max=32767
と表示されたので、「32767」が最大値に設定されているみたいです。
確かに、さっき出力した値は「32767」より小さい値になっていますね。
では、「0~2」みたいな値が欲しいときはどうすればいいのか?
これもいろいろと調べてみると、「余り」を求めることで、できるみたいです。
#include <stdio.h> #include <stdlib.h> int main(void) { int i; for ( i = 0; i<10; i++ ){ printf("rand=%d\n",rand()%3); } return 0; }
のようにプログラムを書くと、
rand=2 rand=2 rand=1 rand=1 rand=2 rand=1 rand=0 rand=0 rand=1 rand=2
のように「0~2」までの範囲の乱数を取得することができます。
あとは、「乱数」を利用して何を作るかなんですが、「C言語」の機能についてまだ学ばないといけないことがあるので、ある程度学んでから何を作るのか考えていきたいと思います。