C言語で本格的な乱数を発生させる方法を知りたいな。乱数を発生させて、本格的なゲームを作ろうと思うんだけど、どうやるの?
こちらの悩みを解決しますね。
まず、乱数に詳しくない人向けに軽く説明します。
乱数とは、ある範囲の数字を等確率で発生させたときの数字のことです。
つまり、乱数はサイコロやルーレットと同じで、毎回どんな数字が出てくるかわかりません。
乱数を使えるようになると、ゲームなども作れるようになるため、ゲームを作りたいと思っている方は必見です!!(出てくるポケモンとかも変えられます)
✔本記事の内容
・乱数の発生に必要なヘッダファイル
・rand関数とは?
・srand関数とは?
・time関数で本格的な乱数を発生させる方法
この記事を書いている自分は情報系大学生で、三ヶ月ほどでC言語の基礎を完璧に理解しました。勉強中に分からないことが多く、一日中プログラミングしていたこともあります。
今では、ブログでC言語について解説しています。
今回はそんな経験をもとに解説していこうかと。
当サイトでは、覚えるべきところを全てまとめているので、画面を撮影して何度も読み返すことをおすすめします。
それでは、解説していきます!
乱数の発生に必要なヘッダファイル
乱数を使うときに必要なヘッダファイルは3つあります。
✔乱数の発生に必要なヘッダファイル
- stdio.h
- stdlib.h
- time.h
一番下の「time.h」が無くても疑似乱数(乱数に似たもの)は作れるのですが、せっかくだから本格的な乱数を作りましょうということですね。
まずは、time.hを使わずにプログラムを作りましょう。
#include<stdlib.h>
#include<stdio.h>
最初の2行はこんな感じですね。
rand関数とは?
stdlib.hをインクルードすると、rand関数が使えるようになります。
rand関数とは、疑似乱数を発生させるための関数です。
✔rand関数の特徴
- 0~32767の数字で乱数を発生させる
- 毎回出て来る値は同じ
変数=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回…と、何度プログラムを実行しても毎回同じ実行結果が出てきます。
テストの結果は毎回、
a=9
b=55
c=60
です。
つまらない ( ̄m ̄)
疑似乱数は、最初から出てくる値が決まっているので、このような結果になってしまうのです。
なので、次はプログラムを何度実行しても毎回出てくる値が異なるプログラムを作っていきます。
srand関数とは?
srand関数とは、rand関数で発生する値を毎回変えるための関数です。
srand関数はrand関数を使う前に
srand(数字);
変数=rand();
のようにして、使います。
で、数字の部分を毎回変えることで、本格的な乱数を使えるようになります。
じゃあ、「数字」の部分を毎回変えるには、どうすればよいかと言うと「時間」を使います。
time関数で本格的な乱数を発生させる方法
時間をプログラムの中で用いる場合、また別のヘッダーファイルをインクルードします。「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回目とは別の値が出てきたので、ちゃんと乱数になっていることが分かるかと思います。
まとめ:乱数の発生方法を3手順で解説
今回作ったプログラムのように、乱数は出てくる値を調節することができます。
ゲームで乱数を調節すれば、レアなアイテムが出てきたりします。
ポケモンとかも時間とかの調整でレアポケモンが出るっぽいですね。
ゲーム作りをもう少し勉強したい人は、「switch文」を勉強しましょう。
次は、配列に文字列を代入する方法を勉強してみましょう。
コメント