線形合同法(乗算型)による乱数発生法

このQ&Aのポイント
  • javaを使って乱数を発生するプログラムを作成するには、線形合同法(乗算型)を使用します。
  • 線形合同法の漸化式はX(i+1)= a*X(i) (mod M)となります。
  • しかし、乱数の初期値や範囲の決定には注意が必要です。
回答を見る
  • ベストアンサー

線形合同法(乗算型)による乱数発生法

javaを使って乱数を発生するプログラムを作っています。 線形合同法(乗算型)に基づいて発生させようと思うのですが、疑問点があり質問しました。 乱数発生の漸化式 X(i+1)= a*X(i) (mod M) で、a,M,そして乱数の初期値を決めたいのですが、ネットを使って調べたところ、 a=16807 M=2147483647 が良いという記述がありました。 しかし、これをプログラムに反映させるとintの範囲から出てしまうため、検出値にマイナスが入ってしまいます。 また乱数の初期値に関する記述が見つからなかったので、どのような値にすべきか悩んでいます。 また、検出値をある範囲に(例えば100000まで)にしたい場合は、M=100000にすればいいと思うのですが、その場合のaや初期値の値はどのように決定したらよいのでしょうか? 教えて下さい。よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> 「乗算の結果あふれた部分」というのは、「マイナスになってしまう検出値」という解釈でいいのでしょうか? たとえば8ビットに単純化して話をすると 0xff × 0xff とかすると 0xfffe がその積になりますが、ここで 上位の0xff は無視するという意味です。 有符号の32bit整数であるなら、0x7fff_ffffを越えたところでは 最上位ビットは無視するということでいいのではないでしょうか。 これはまあ「マイナスになってしまった値」ですけどね。

p-aimar
質問者

お礼

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

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

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

p-aimar
質問者

お礼

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

関連するQ&A

  • 合同混合法・乗算合同法の実際の周期について

    現在「混合合同法」と「乗算合同法」を用いた乱数の発生実験を以下のような条件で行っております。その中でいくつか疑問点が出てきたので質問いたします。 「混合合同法」 R(i+1)=R(i)*A+C (modM) A=1229 C=351750 M=1664501 R(0)=1 「乗算合同法」 R(i+1)=R(i)*A(modM) A=48828125(=5^11) M=2^31 R(0)=584287 これらの実験を行う中で周期をMに設定しているのに、実際に同じ値が返されてくるまでの周期が「混合合同法」では約半分、「乗算合同法」では約四分の一になっております。なぜこのようになるのでしょうか? また乗算合同法では奇数しか返されないのですがこの理由と、奇数しか返されないことで起こる不都合もお教えください。 なお、これはCでプログラミングしているのですが同一の値が返される回数を簡単に表示するようにするにはどのようにプログラムすればよいでしょうか?ご助言ください。

  • 乱数を発生させるプログラムを教えてください。

    タイトルのままなのですが、1から100までの乱数を発生させるプログラムを知りたいです。 乱数をxとおくと、xの値は、0<x<1の範囲内でお願いします。 C言語で、rand関数を用いて、どうかお願いします。

  • Excelで乱数発生のアルゴリズム

    今、Excelでの乱数発生に関して勉強しているものです。 プログラミングの本や、乱数の本を読んで線形合同法という漸化式が乱数発生のときに使用されているというところまで調べることはできたのですが、Excelでのアルゴリズムについてはあまり調べられなくて困っています。 知っている方がいらっしゃいましたら教えてください。 よろしくお願いします。

  • 発生乱数の偏りを無くしたい

    エクセルで=RAND()を用いてA1~A100のセルに100個乱数を発生させたときに(乱数は0~1の幅)、0~1の値を偏り無く発生させることは可能でしょうか?? 発生した100個の乱数をコピーして形式を“値”にして貼り付けてその100個の乱数の平均や中央値をみてみると0.5にはならないことから疑問に思いました・・・。 ご存知の方アドバイスよろしくお願いします。

  • 発生させた乱数を用いての作業

    こんにちは 今回乱数発生で300個の乱数を作りました その乱数の二乗を新しいシートに出したいのですが、 単純にひとつの値をコピーして、それを二乗してオートフィル とやっても同じ値しか出てきません コピーする段階で、Sheet1のA1 のコピーという感じでできればいいのですが 単純に乱数の値しかコピーしてくれません。 どうすればできるのでしょうか? どうか教えてください

  • 混合合同法による一様乱数

    今、プログラム言語で混合合同法で一様乱数を発生させようとがんばっているのですが、まず、混合合同法の式は Xn+1 = a*Xn + b(MOD L) てな感じじゃないですか?まず分からないのは、(MOD L)です。Lで割った余りが。。って習った覚えがあるのですが、何をLでわるのですか?もしbをLでわるなら、bには何を初期値として入れればいいのですか?aは素数もしくは5の奇数乗、Lは10の乗数って分かってます。bとはいったい。。教えて下さい。

  • fortran77で乱数を発生させたい

    fortran77で乱数を発生させたい こんばんわ。fortran77で乱数を発生させるにはどうすればいいのでしょうか? 調べてみるとfortran90ならば乱数の組み込み関数が用意されているようなのですが、fortran70にはないそうです。   real function random(i)    i=843314861*i+453816693    random=real(i)/2**31   end function   do 10 k=1,n    ransu(k)=random(i) 10 continue これを用いることで乱数が発生できると書いてあったのですが、オーバーフローしてしまったせいか、値がマイナスのものが出てきてしまい、うまくできませんでした。 これ以外にも方法はないでしょうか? 私の環境はsalford FTN77です。 回答よろしくお願いします。

  • 乱数について

    こんばんは。 何度も申し訳ありませんが、今回は乱数について教えてください。 LinuxでCを勉強しているんですが、 randで乱数を発生させることはできたんですが、 そのプログラムを何度実行させても 出てきた乱数は同じ値なんです。 プログラム内で例えば10こ乱数を発生させたとすると 違うものが出ます。 しかし、もう一度そのプログラムをはしらせると 前回と全く同じ並びで同じ数が出るのはどうしてでしょうか? 言ってる意味わかっていただけましたでしょうか? 宜しくお願いします。

  • 三角分布に従う乱数

    三角分布に従う乱数を発生させるプログラム 最頻値gで、0.8g~2.5gの範囲の三角分布(当然面積は1です)に従う乱数を発生させるプログラムを 書きたいと思っています。 この三角分布の確率密度関数をP(x)とすると、三角分布であるので最頻値gの左側である、傾きが正の直線h(x)と 最頻値gの右側である、傾きが負の直線f(x)で表せますよね 分布に従う乱数を発生させるためには、これら直線の関数を積分したものの逆関数x=P^-1(u) (Pのインバースです) (uは区間[0, 1]の一様乱数)とすればいいというところまでわかったんですが、 とりあえずh(x)とf(x)をそれぞれ積分して逆関数H^-1(u)、F^-1(u)を求めたところまではいいんですが x=H^-1(u)+F^-1(u)としてプログラムを実行すると、最頻値gの2倍あたりの値(例えば20に対して39など) しか出ず、最頻値gより小さい値が出ません。 H^-1(u)+F^-1(u)としているのがダメだと思うのですが、逆関数が2つある場合、ここからどうすればいいですか? また、初歩的な質問なのですが、区間[0, 1]の一様乱数というのはどう記述すればよいですか? ぜひ多くの方の回答お待ちしています。 よろしくお願いします。 (最頻値gは入力で与えるものとします)

  • 正規分布に従う乱数を発生させるには?

    0以上1未満の実数のうちから均一な確率で乱数を発生できるものがあるとします。 (頭にあるのはプログラムのrnd関数です)。 この乱数をxとしたとき、このxを適当な変換式f=f(x)に代入して 正規分布に従うような数yを得たいと思います。 どうすればよいでしょうか?

専門家に質問してみよう