~初心者のプログラミング言語学習記~ サトルのC言語学習再挑戦!

「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言語」の機能についてまだ学ばないといけないことがあるので、ある程度学んでから何を作るのか考えていきたいと思います。

→「Twitter:@satoru78888」

HOMEへ