• ベストアンサー

乱数について(Rnd関数)

すみません。質問があります。 VBAを用いてパチスロシミュレータを作成しているのですが 乱数が偏っている気がしてなりません。 乱数はRnd関数を用いて0~65535の範囲で生成しています。 もちろん初期化時にRandomizeも用いています。 毎ゲーム開始時にそのゲームで必要な乱数を4つ r1 = Int(Rnd() * 65536) r2 = Int(Rnd() * 65536) r3 = Int(Rnd() * 65536) r4 = Int(Rnd() * 65536) というように生成しています。 それらの乱数を用いて複雑なモード移行などを行っているのですが、 ある条件下でr1のあるビットが1になりやすいというような現象が起こります。 乱数に法則性があることは不思議ではないんですが、Rnd関数による乱数っていうのは多少複雑な処理をしただけでこのような不具合が出る可能性があるのでしょうか。 私のプログラムに問題があるとは思うのですが、「もしかして、乱数のせいかも?」という疑念を抱いてデバッグするのはつらいものがあるので。 ですので、 ・変な使い方をすれば目に見えて偏る可能性もある。 という意見の方はその「変な使い方」というのを具体的に教えていただけないでしょうか? また、そのような意見の方がしばらくいらっしゃらない場合はRnd関数による乱数は実用上問題なく使えると解釈したいと思います。 よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

VBAに限らず言語処理系の標準ライブラリなどで用意している乱数は往々にしてお粗末なものです。 だいたいが線形合同法を使っているので、下位ビットだけ取るなどの使い方をすれば簡単に法則性が出てしまいます。 品質の良い乱数アルゴリズムとしてはメルセンヌ・ツイスタが知られていますが、VBAで使うには重いでしょう。 ゲームの種くらいならRndでもそこそこ使えると思います。 下位ビットだけ使ったり余りに長い系列を使ったりという悪い使い方をしないというのが前提になりますけど。

参考URL:
http://www001.upp.so-net.ne.jp/isaku/rand.html
Ryo0617
質問者

お礼

ありがとうございます。 各乱数の取得時に違う乱数系列を使用すればとりあえずうまくいきました。 r1 = Int(Rnd() * 65536) r2 = Int(Rnd() * 65536) r3 = Int(Rnd() * 65536) r4 = Int(Rnd() * 65536) ↓ r1 = Int(RndUser1() * 65536) r2 = Int(RndUser2() * 65536) r3 = Int(RndUser3() * 65536) r4 = Int(RndUser4() * 65536) モンテカルロ法では乱数がしっかり機能するのかも考慮しなければいけないんですね。 これからも不安です。 お二人ともありがとうございました。

その他の回答 (1)

回答No.1

すみません、あまり読んでませんが。 「VB Rnd function precise」で検索 http://www.15seconds.com/issue/051110.htm 「VB 乱数 精度」でもいけるかも。日本語訳あったし http://japan.internet.com/developer/20060124/26.html 似たような症状を聞いたことがあったので「線形合同式法 カルドセプトサーガ」で検索 http://forzaxbox360.blog56.fc2.com/blog-category-34.html