rand 関数について
【 rand 】を使うことにより【 0~RAND_MAX 】までの間で乱数を発生させることが出来ます。【 RAND_MAX 】は数学関数の一般ライブラリ<stdlib.h>にて【 #define RAND_MAX 0x7fff 】と定義されており、これを十進数で表現すると【 32767 】になり、0~32767までの乱数を発生させることになります。
簡単な乱数取得サンプルから
※【 #include <stdlib.h> 】は【 rand 】関数を使用するのに必要です。
#include <stdio.h> #include <stdlib.h>int main(void) { double i; i=rand(); printf(“乱数%f\n”,i);return 0; } |
解説、【 rand(); 】と記述すれば、乱数を発生させる事が出来ます。実数型変数名【 i 】に乱数を代入し、出力させております。
実行結果
ループさせて幾つかの乱数を取得させる方法
記のプログラムをループさせて幾つかの乱数を取得させる方法です
#include <stdio.h> #include <stdlib.h>int main(void) { int a; double i;for(a=0;a<=6;a++){ i=rand(); printf(“乱数%f\n”,i);} return 0;} |
以下は六回ループさせて乱数を取得し出力させるようになっておりますが、
何度も実行するとわかるように、毎回同じ乱数が出力されていまいます。
単純に【 rand() 】とすると毎回同じ乱数が発生する事を「同じ乱数系列」と言い
異なる乱数を得たい場合は【 srand() 】関数で乱数系列を再設定します。(※この下の説明を参照して下さい。)
上記ソースの場合わざわざマクロを使うほどの物ではないのですが、以下の様に記述すれば
プログラムの内容がわかりやすくなるとの事です。
#include <stdio.h> #define max 100 int main(void) { int i; for(i=0; i<=max; i=i+10){ printf(“%d\n”,i); } return 0; } |
上記の複数回実行結果
同じ乱数が得られております。
「srand()」を記述して、指定した整数から新しい乱数を発生させることが出来ます。
サンプル
#include <stdio.h> #include <stdlib.h>int main(void) { int a; double i;srand(5); for(a=0;a<=6;a++){ i=rand(); printf(“乱数%f\n”,i); } return 0;} |
解説、【 srand() 】をループに入る前に設定し【 rand() 】のみ記述の際と異なる乱数を発生させることが出来ます。
しかしながらそれでもランダムに発生させることは出来ません。
※【 srand(5) 】中に設定する整数は任意のものでOKです。
上記の複数回実行結果です。
【 rand() 】の場合と異なる乱数が発生しておりますが、発生する乱数はやはり同じ値になります。
異なる乱数を取得説明
【 rand 】及び【 srand 】での乱数取得方法を説明させて頂きました。
本日は【 time 】関数を使って実行する度に異なる乱数を発生させる方法に付いて説明させて頂きたいと思います。
乱数を発生させる前に【 srand() 】関数で時間をの戻り値を使って、乱数を初期化すれば、異なる乱数を取得する事ができます。以下の記述は定番との為、覚えておくといいようです。
srand((unsigned)time(NULL));
※【 time() 】関数を使用するには【 #include 】ヘッダ宣言する必要があります。
サンプルソース
#include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) { double i; srand((unsigned)time(NULL)); i=rand(); printf(“%f\n”,i);return 0; } |
解説、【 rand() 】関数で乱数を発生させる前に、【srand()】による乱数の初期化を行います。
ただ【 srand(5) 】等のように数値を指定してしまうと、同じ値が出力されてしまいますので、
実行時間を元に乱数を発生させる定番の記述【 srand((unsigend)time(NULL)); 】を乱数を発生させる前に記述すれば
毎回実行時に、時間を元に乱数を発生させる事が出来るようになります。
実行結果
微妙に異なりますが、それぞれ取得した乱数の結果が異なります。
乱数で遊んでみる おみくじプログラム
サイコロの目を出力して、おみくじのサンプルを作って見ました。
(※perlでよく出るサンプルです)
【 rand 】0~32768乱数を発生させる数学関数を使い、6の剰余(割った余り)を求めさせます。すると0~5をランダムに出力させる事が可能になります。それをさいころ風にさせる為、+1としています。
#include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) { int i; srand((unsigned)time(NULL)); i=rand()%6+1; if(i==1){ return 0; |
解説、変数【 i 】(取得する乱数は整数になるのでint型になります)に【 rand()%6+1 】にて1~6までの値を発生させ代入し 【 if 】文にてそれぞれの結果を出力しています。
実行結果、異なる乱数を取得し、出力されていることがわります。
コメント