【初心者】課題をクリアしていくスレ【講習会】at GAMEDEV【初心者】課題をクリアしていくスレ【講習会】 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト700:名前は開発中のものです。 08/04/12 17:37:14 VRvbtz8m 乱数範囲による偏りに加えて、 線形合同法による乱数の下位nビットの周期が 高々2^nという点にも気をつけないといけない。 つまり、下位1ビットの周期は高々2^1 = 2。 偶数しか生成しないか、奇数しか生成しないか、 偶数と奇数が交互に生成されるかの3パターンしかない。 よって、線形合同法による疑似乱数生成関数randでサイコロを作ろうとして rand()%6+1とかやっちゃうと、2人で遊んだ時に 片方のプレイヤーが偶数の目だけ、もう片方が奇数だけという状況が生まれる (これをやっちゃった有名な例がカルドセプトサーガ)。 今でもCのrand関数は線形合同法のような形で実装されていることが多いけど、 下位kビットを捨て、k+1ビット目からを1ビット目と見なすことで 周期性の問題を解決しているものもある。 701:名前は開発中のものです。 08/04/17 23:00:01 xfcPWlW/ 1~100までの数が書かれた玉が1個ずつ入った箱から、玉を取り出す場合は、どの数が出てくる確率も同じだけど、 1~100までの数が書かれた玉が1個ずつ入っていて、さらに1~10の玉を箱の中に追加したら確率が変わる。 そういうことだな。 で、余分に入れちゃった1~10を取り除く処理が必要というわけだ。 rand()から得られる乱数範囲 : 0~65535 取得したい乱数範囲 : 0~99 の場合、0~99が同じ確率で得られるように 65535 - (65535 % 100) = 65500 を超えた部分は捨てる つまり、rand()の戻り値が65500より大きかった場合は、無効な範囲から取得したとして rand()による乱数取得をもう一度やりなおす。 プログラムの流れをまとめてみた 1. rand()を実行 2. もし、rand()の戻り値が65500より大きいなら1.へもどる 3. rand()の戻り値を100で割った余りを得る 4. おわり 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch