C言語 入門 乱数の発生方法(疑似乱数じゃない!)stdio.h

C Language

ゲームがどうやって作られているのか知りたい!

C言語で乱数を使えるって聞いたけど、どうやるの?

そもそも、乱数がよくわからない!

今回はこれらの悩みを解決していきます。

乱数とは、ある範囲の数字を、等確率で発生させたときの数字のことです。

つまり、乱数はサイコロやルーレットと同じで、毎回どんな数字が出てくるかわかりません。乱数を使えるようになると、ゲームなども作れるようになるため、ゲームを作りたいと思っている方は必見です!!(出てくるポケモンとかも変えられます)

乱数の発生方法

乱数を使うときに、今までと大きく異なる点があります。

それが、「ヘッダーファイル」です。ヘッダーファイルは今まで「stdio.h」を使ってきたかと思います。「stdio.h」を使えば今まで学習してきた基本的な計算や出力などができます。また、プログラムの最初に「#include<stdio.h>」と書くことを「stdio.h」をインクルードすると言います。

今回は別のヘッダーファイルをインクルードします。

ヘッダーファイル

乱数を使用する際は「stdlib.h」というヘッダーファイルをインクルードします。また、今回は、乱数を出力するので「stdio.h」もインクルードする必要があります。

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

rand関数とは?

乱数を発生させるには、「rand関数」を使う必要があります。「変数=rand();」とすることで変数に乱数を代入することができます。

しかし、この乱数の使い方はあまり使い物になりません。

なぜでしょうか?

この「rand関数」というものは、0~32767の数字を表示させるのですが、こんなに多くの数字を使う必要はないですよね。

そこで、剰余算「%」を使って調節します。例えば、1~100の数字を出力するには

変数=1+rand()%100;

とします。(変数を100で割ると0~99の数字になり、1を足すと1~100になります。)

このように乱数を使う際は自分で計算をして出力される値を調節する必要があります。

例えば、3人でテストをして、必ず50~100点以内に入るという条件を付けるとこのようなプログラムになります。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a,b,c;

    a=50+rand() % 51;
    b= 50+rand() % 51;
    c= 50+rand() % 51;
	
    printf("a=%d¥n",a);
    printf("b=%d¥n",b);
    printf("c=%d¥n",c);
}

「%51」で0~50の数字にして、そこに50を足すことで、50~100になります。変数は3人分必要です。

実行結果がこちらです。

で、このままだと2回,3回…と、何度プログラムを実行しても毎回同じ実行結果が出てきます。

実は、この乱数というのは疑似乱数と言って最初から出てくる値が決まっています。

なので、次はプログラムを何度実行しても毎回出てくる値が異なるプログラムを作っていきます。

srand関数を使う!

「srand関数」というものを使うと、発生する乱数の値を毎回変えることができます。

「srand関数」は「rand関数」を使う前に記述します。

srand(数字);

のようにして、使います。

で、この「数字」の部分を毎回変えることで、本格的な乱数を使えるようになります。

じゃあ、「数字」の部分を毎回変えるには、どうすればよいかと言うと「時間」を使います。

本格的な乱数とは??

時間をプログラムの中で用いる場合、また別のヘッダーファイルをインクルードします。「time.h」というものです。

time.hをインクルードすると、「time関数」というものが使用できます。プログラムはこんな感じで書きます。

srand((unsigned int)time(NULL));

srand関数の中は難しいのでそのまま覚えちゃってください。実際、現段階だと乱数を使ったときにセットで「time関数」を使えれば問題ないです。覚えられない人は、このページをブックマークして、使いたいときに見直してみましょう。

ここまでのプログラムをまとめてみます。

#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
   int a,b,c;
   srand((unsigned int)time(NULL));

   a= 50+rand() % 51;
   b= 50+rand() % 51;
   c= 50+rand() % 51;
	
   printf("a=%d¥n",a);
   printf("b=%d¥n",b);
   printf("c=%d¥n",c);
}

ヘッダーファイルは全部で3つ使いました。実行してみます。

ちゃんと乱数になっていることを確かめるために、もう1回プログラムを実行してみます。

2回目とは別の値が出てきたので、ちゃんと乱数になっていることが分かるかと思います。

まとめ

今回作ったプログラムのように、乱数は出てくる値を調節することができます。ゲームで乱数を調節すれば、レアなアイテムが出てきたりします。また、カジノとかでも乱数を調節していると聞きます。本当かどうかは店側しか分からないですが、やらない方がいいかもですね。

ゲーム作りをもう少し勉強したい人は、「switch文」を勉強しましょう。

次は、配列に文字列を代入する方法を勉強してみましょう。