乱数を取得する関数

 今回はstdlib.hのヘッダファイルをincludeすれば使えるようになる命令の中から、rand関数について説明します。rand関数は、ランダムな数値(乱数といいます)を取得するための関数です。占いやすごろくゲームのプログラムなどで、ランダムな数を取得したいときに使うことができます。

 まずは以下のサンプルプログラムを作成し、実行してみて下さい。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[])
{
    
    // insert code here...
    printf("RAND_MAX : %d\n", RAND_MAX);
    printf("乱数 : %d\n", rand());
    printf("乱数 : %d\n", rand());
    printf("乱数 : %d\n", rand());
    printf("乱数 : %d\n", rand());
    printf("乱数 : %d\n", rand());
    
    return 0;
}

 実行すると、以下のような結果が表示されます。

RAND_MAX : 2147483647
乱数 : 16807
乱数 : 282475249
乱数 : 1622650073
乱数 : 984943658
乱数 : 1144108930

 乱数の範囲は、最小値が0で、最大値はstdlib.hで定義されている定数RAND_MAXの値(実際の値は、作成する環境に依存します)までとなります。もし、サイコロのように1から6までの数のみを取得したい際、推奨されている方法としては、まずは以下のように0以上1未満の小数値で乱数を取得します。

double randValue;
randValue = rand() / (double)(unsigned)(RAND_MAX + 1);

 この小数を6.0倍すると、乱数の値は0以上6未満の小数値になります。この値に1を足してint値にキャストすることで、1から6までの整数値を得られます。

printf("サイコロの目 : %d\n", (int)(randValue * 6.0 + 1.0));

 ところで、上記のプログラムを何度も実行すると、毎回、乱数の値が同じ値が得られることにお気づきでしょうか。上記の例で言えば、1回目の乱数は、何回プログラムを実行しても16807になります。この理由は、乱数を得るときは、プログラムが実行される環境によって異なる乱数の種というものが設定され、その種を使って乱数を得るからです。種は自分で変更しない限り一定であるため、実行する度に同じ変数になってしまうのです。そこで、種を入れ替える命令であるsrand関数関数を用います。srand関数に、以前ご紹介した時間を取得するtime関数を組み合わせることで、実行する度に異なる乱数を得られます。以下のプログラムを作成し、実行してみて下さい。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>		//time関数を使うので

int main(int argc, const char * argv[])
{
    
    // insert code here...
    
    // 現在時刻を種に設定する
    srand((unsigned)time(NULL));
    
    for(int i = 0; i < 5; i++) {
        // 乱数を取得する
        double randValue;
        randValue = rand() / (double)(unsigned)(RAND_MAX + 1);
        printf("サイコロの目 : %d\n", (int)(randValue * 6.0 + 1.0));
    }
    
    return 0;
}

 プログラムを実行する度に、5回のサイコロの目がそれぞれ変わることを確認して下さい。

■スポンサーリンク

このページの先頭へ