きになる

C言語初心者学習記Part9

ランダムに数を出してほしい!

さて、引き続きジャンケンゲーム(仮)の話題なのですが…

このジャンケンゲーム(仮)では、コンピューターにもジャンケンの手を出してもらわなくてはいけません。

便宜上1・2・3にジャンケンの手は対応させていますので、コンピューターは1・2・3のいずれかの数字を出してくれればOKです。

そこで、今回はどうやってランダムな数を生成するかという話です。

特定範囲の数値をランダムに出す方法

ただ普通にrand関数を使うと同じ試行内では同じ値しか返しませんでした

そのため、srandとtimeをつかって1秒ごとに乱数を変えるようにします。

Part7のコード全文の中の41~43行目ですね。

srand関数には乱数を初期化するための種が必要だそうです。

そのため、簡単な乱数発生関数を作るためにtime関数を種にしています。

 

その後にrand関数でランダムに数値を発生させます。

今回は1~3の整数を出してほしいのでその最大値3で割った余りを求めます。

そしてそれに1加えれば1~3を出力できます。

※この原理に「?」と思われた方もいるかもしれません。私も思いました。しかし、よくよく考えてみれば納得できます。
1.先ずunsigned intでint型の取り得る値は0~32767となります。
2、これらを%を使って3で割った時の余りについて考えます。(この場合出る余りはすべて整数値)
3、余りは「割りきれなかった」といことであり、どんな数を割っても0<=x<=2の値を取るハズです。(つまり、余りは割る数以上にならない)
4、この時点で0~2の数がランダムに生成されることになります。
5、しかし、これでは3が出てこない上に0が入ってしまいます。6、なので、3で割った余りに1を足して取り得る範囲をずらします。これで、1<=x<=3の値を取ります。

これで、1秒ごとにコンピュータが1~3の整数をランダムに出すようになります。

 

問題点

正直、このジャンケンゲーム(仮)においてはどうでもいいことなんですが、このrand関数は甘いので簡単に攻略されてしまいます。

ここでは、1秒以内ならば同じ手を出すので、ズル等をして一戦流し、コンピューターの出した手を覚えてそれに勝てる手を出せば必ず勝てます。

意外と一秒あればできますw

脳トレっぽい感じになってますが。

まぁ…

そうまでしてこのゲームを攻略したいとは思いませんが…。

ただ、ゲームやシュミレーターで精度の高い乱数が欲しい時は工夫した方が良いのかもしれません。

 

…どうやって精度の高い乱数を得るかは詳しい人に聞いてください

ごめんなさいw


 

【前→C言語初心者学習記 part8

【後→C言語初心者学習記 part10】


0

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA