ページ 11

rand関数がまったくわからない・・・・

Posted: 2011年4月25日(月) 20:25
by jack
私は今rand関数やsrand関数を練習しているんですが
根本的にわかりません・・・
どなたか教えてくれるひとはいますか?
ずうずうしくてみません・・・

Re: rand関数がまったくわからない・・・・

Posted: 2011年4月25日(月) 20:30
by たかぎ
とりあえず自分なりの考え方とか使い方を示してくれないことには、リファレンスと同じ内容の回答しかできません。

Re: rand関数がまったくわからない・・・・

Posted: 2011年4月25日(月) 22:26
by Dixq (管理人)
randではないですが、丁度昨日乱数について書いていました。
http://dixq.net/g/02_06.html

rand関数は「ランダムっぽい数を作る」関数です。
コンピュータは「いい加減な数を作る」ということがとても苦手なので、一見ランダムに見えるような数しか作れません。

今、0~9のランダムな値を作るために

(23 + 127*n) %10

という計算式(数は超適当)で計算していたとしましょう。

n=0の時は
(23 + 0)%10
だから 3 です。

n=1の時は
(23 + 127) %10
だから 0 です。

n=2の時は
(23 + 254)%10
だから 7 です。

こうして 3, 0, 7... という一見ランダムな数が生成出来ました。
ではプログラムを再起動して、またn=0から乱数を生成してみましょう。
また、同じ数である3,0,7...になると思います。

試しにrandで出た数をメモっておいて、もう一度randを出してみて下さい。
何度やっても同じ数になります。

しかし、「初期値」を変えるとどうでしょう。
ココで言うと

(23 + 127) %10

(29 + 127) %10

のように変えるのです。
そうすれば

(29+0)%10 -> 9
(29+127)%10 -> 6
(29+254)%10 -> 3

9,6,3...となり、乱数が変わりました。
このように計算式の「初期値」を変えることで異なる乱数が生成出来ます。この初期値を変える関数がsrand関数です。
逆に言えば初期値を同じにすれば前に出した乱数と同じ乱数が生成出来ます。

一般的に、乱数の初期値には「現在の時刻」が使われます。
時刻は刻一刻と過ぎ、ゲームなどをする度にかわるので使いやすいのです。

上記リンク先なども参考に、初期化したりして実行結果を確認してみて下さい。