- ベストアンサー
乱数で交互に偶数、奇数が、、、。
C言語で、確率2分の1で0と1を 出そうとして、rand,srand,timeを使って やってみたのですが、ちょうど、0と1が 交互に出てしまいます。何度やっても 変わりません。ただ、1と0が逆になる だけ。こんな感じで0101010101か1010101010 つまり、乱数で奇数と偶数が 交互に発生しているみたいうまくいきません。 なにか、別の方法ありますか? --------------------------------------- srand((unsigned int)time(NULL)); s=rand()%2 これで、やってます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
randの返す乱数は下位ビットのみに注目した場合悲しいほどランダムでない値である場合があります。 #define SHIFT_COUNT // 適当に値を決めてください (rand() >> SHIFT_COUNT) % 2 ; のように上位ビットを使いましょう。
その他の回答 (2)
- kaitou-man
- ベストアンサー率60% (86/141)
srandはそれ以降にrandで出てくる乱数の系列を決定するために、プログラム開始時に1回だけ実行すればいいものです。毎回やっているのだとすればそれを修正してみてください。 それからrand()自体はあまり品質のいい擬似乱数関数ではありません。特に、下位のビットはかなり短い周期で繰り返します。上位の(30ビット目などの)ビットを使うようにするか、より高品質なrandom()が使えるならこちらの使用をおすすめします。
お礼
擬似乱数だというのは、知っていましたが、 質が良い、悪いというのがあったのですね。 考えてみれば、本当の乱数ではないのだから 当たり前なのかもしれませんが。 回答ありがとうございました。
- wolv
- ベストアンサー率37% (376/1001)
s=(int)(rand()*2.0) (randが0から1の小数を返す場合) または、 s=(int)((rand()/MAX_INT)*2.0) (randが1からMAX_INTまでの整数を返す場合) のようにやるべきです。 randの下位のほうは質問のようなことが起こるので、使うべきではない、となっていました。 確か、UNIX系のOSで、 man rand として表示されるオンラインマニュアルに書いてある情報だったと思います。
お礼
上位ビットを使うことで、うまくいきました。 シフトして使うことは、全く思いつきませんでした。 もっともっと勉強しなければ、ならないみたいですね。 回答ありがとうございました。