【c++入門】乱数(rand)
今日はプログラムでたまに?使われるランダム関数について。
1~6までの数字をランダムに発生させる定番のプログラムが書いてあったのでメモ。
重要なのはまずヘッダの部分。
catdlibとctimeをインクルードする必要がある。
まあこれはこう覚えるしかないか。。。
次にsrand((unsigned)time(NULL))の部分。
srand関数を呼び出して、()に実引数の部分を書く。
unsignedはキャスト変換だから良いとして、
time関数をさらに呼び出している。多分今日の時刻が呼び出されている。
NULLは0だから、なんだこれ?誰か教えてください。
んで、forループに入っていき、coutの部分で出力。
rand()%6+1の文自体が、データに置き換わるので(関数の性質)、
ここに現れるランダムな1〜6までの数値がデータとして置き換わり、
出力されるという感じ。
%について。6で割る場合
1÷6=0・・・1
2÷6=0・・・2
3÷6=0・・・3
4÷6=0・・・4
5÷6=0・・・5
6÷6=1・・・0
7÷6=1・・・1
て感じで、6より小さい数(0〜5)については、商は0。
あまりは割ってもらえなかった(0〜5)がそのままあまりになる。
ここまでは算数の小学低学年の問題なのでOK。
肝心なのはそのあと。
6で割れるところまでギリギリ割っているので、
あまりは6より大きくなることはない。←この考え方が重要!
なので、rand()%6+1という部分は、ランダムなマイナスのない整数値を6で割った場合は、あまりとして必ず0〜5までの数値が返ってくる計算が成り立つ。
その上で、1〜6までの数値を取り出したいなら、最後に+1をしてあげる必要があるというわけだ。
ちなみに以下を実行した時の出力がコレ。
1
1
5
2
4
2
0
2
5
1
0
5
見事に0〜5までのランダムな数値を取り出せた。
これでランダム関数は使えそう。