アプリ版:「スタンプのみでお礼する」機能のリリースについて

javaを使って乱数を発生するプログラムを作っています。
線形合同法(乗算型)に基づいて発生させようと思うのですが、疑問点があり質問しました。

乱数発生の漸化式
X(i+1)= a*X(i) (mod M)
で、a,M,そして乱数の初期値を決めたいのですが、ネットを使って調べたところ、
a=16807
M=2147483647
が良いという記述がありました。
しかし、これをプログラムに反映させるとintの範囲から出てしまうため、検出値にマイナスが入ってしまいます。
また乱数の初期値に関する記述が見つからなかったので、どのような値にすべきか悩んでいます。

また、検出値をある範囲に(例えば100000まで)にしたい場合は、M=100000にすればいいと思うのですが、その場合のaや初期値の値はどのように決定したらよいのでしょうか?
教えて下さい。よろしくお願いします。

A 回答 (2件)

> 「乗算の結果あふれた部分」というのは、「マイナスになってしまう検出値」という解釈でいいのでしょうか?



たとえば8ビットに単純化して話をすると
0xff × 0xff とかすると 0xfffe がその積になりますが、ここで
上位の0xff は無視するという意味です。

有符号の32bit整数であるなら、0x7fff_ffffを越えたところでは
最上位ビットは無視するということでいいのではないでしょうか。
これはまあ「マイナスになってしまった値」ですけどね。
    • good
    • 0
この回答へのお礼

2度も回答していただいてどうもありがとうございます。
8ビットの知識は全く無いのですが、なんとなく理解できました。
ありがとうございます

お礼日時:2007/06/04 08:30

回答がつかないようなので。



数値は無符号で扱い、乗算の結果あふれた部分は無視するという
手順でやるのではなかったでしたっけ?
Mを適当に決めてしなうと周期等で問題が生じることが懸念されるので、
別の方法で範囲内に収めるようにしたほうがよいと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
範囲内で収める方法、調べてみます。
「乗算の結果あふれた部分」というのは、「マイナスになってしまう検出値」という解釈でいいのでしょうか?
理解力が無くてすいません・・・

お礼日時:2007/06/04 00:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!