線形合同法の欠点とは?

このQ&Aのポイント
  • 線形合同法の欠点は、最下位ビットのパターンが予測可能であることです。
  • 欠点の項目によると、最下位ビットの結果は奇数か偶数かを示しているため、結果的に偶数だけが出る、奇数だけが出る、または偶数と奇数が交互に出ることがあります。
  • しかし、生成の例では「奇数(3)→奇数(1)→偶数(8)」など、欠点の項目とは異なるパターンが出ています。この矛盾については具体的な情報が得られず、理解できませんでした。
回答を見る
  • ベストアンサー

 線形合同法の欠点について

 線形合同法の欠点について  wikipediaで線形合同法(http://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E5%90%88%E5%90%8C%E6%B3%95)の欠点の項目を見ると、 『最下位ビットは、同じものが出続けるか、0と1が交互にでるかのどちらかである。これは、最下位ビットが結果的に、奇数か偶数かを示しているため、偶数ばかりが出る、奇数ばかりが出る、偶数と奇数が交互に出る、という意味である。』  と書いているのですが、生成の例を見ると「奇数(3)→奇数(1)→偶数(8)」と結果が出ています。欠点の項目で書かれてあることと違うじゃんと思って、この矛盾について検索しまくって調べたのですが、よく理解できませんでした。  よろしければ教えていただけないでしょうか?

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

  • ベストアンサー
  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.1

数列をX[n+1], X[n]と書くことにします。 X[n+1]を計算するときには次のステップを踏みます。 (1) AX[n] + Bを計算する (2) AX[n] + BをMで割った余りを考える。 (1)の時点でAX[n] + BがMより小さければ、 (2)のステップはする必要がありません。 つまり乱数がMより大分小さければ、しばらくは(2)のステップをやる必要がありません。 計算中の乱数がMより大きくなったときだけ(2)のステップを実行する必要があります。 素人の推測ですが、wikipediaに載っている話は 「(2)のステップが実行されない間」の話に限定されている気がします。 (1)の計算は、A, X[n], Bの3つの偶数・奇数の情報だけで AX[n] + Bの偶数・奇数も決まってしまいます。 AとBは固定されているので、実質AX[n] + Bの偶数・奇数は X[n]の偶数・奇数の情報で決まるということになります。 なのでこの時はwikipediaの話が当てはまります。 ただし(2)の計算で考える「AX[n] + BをMで割った余り」に関してはそうなりません。 特にMが奇数の場合、A, X[n], Bの3つの偶数・奇数の情報だけが分かっても 「AX[n] + BをMで割った余り」が偶数・奇数のどちらになるかは分かりません。 これは実際に割ってみるまで分からないはずです。 よって(2)の計算をすると、X[n+1]の偶数・奇数はX[n]の偶数・奇数によらなくなります。 この時wikipediaの話が当てはまらなくなります。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

C などのプログラミング言語についている乱数生成器では, たいてい法が 2のべきになっています. 「欠点」のところに書かれているのはその状況のことでしょう. もっとも, 「多次元の不均等分布」の方が本質的に問題なんだけど....

関連するQ&A

  • 線形合同法について

    線形合同法のRi+1=(a×Ri×b)=mod cなんですがa=5 b=3 c=8とするとき1回目=0 2回目=3 3回目=2 4回目=5となるとかいてあるのですがなぜこうなるのかがわかりません。特にmodがどういう意味なのかがわかりません。よろしければ教えてください。

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

    現在「混合合同法」と「乗算合同法」を用いた乱数の発生実験を以下のような条件で行っております。その中でいくつか疑問点が出てきたので質問いたします。 「混合合同法」 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でプログラミングしているのですが同一の値が返される回数を簡単に表示するようにするにはどのようにプログラムすればよいでしょうか?ご助言ください。

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

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

  • 乱数について

    線形合同法が乱数生成アルゴリズムとして欠点が多いことは有名です。 http://www001.upp.so-net.ne.jp/isaku/rand.html さて、自分のPC(OSはubuntu、言語はC++です。)で、rand()を用いて、 最下位ビットが0、1が繰り返して現れるかどうかを確認しましたところ、 そんなことはありませんでした。 このことから、自分のマシンは線形合同法を用いていないと判断してよいのでしょうか? また、よろしければ、マシンがどの乱数アルゴリズムを使っているかを 調べる方法を教えてください。 先のURLでは、「/usr/ucb/cc を解析した結果、」とありますが、 そんなディレクトリはありませんでした。

  • 三角形の合同条件

    「2辺と1角が等しい」というだけでは三角形は合同だとはいえませんが(下記URL参照)、 AB=A'B'、AC=A'C'、∠B=∠B'に「AB<AC」という条件を加えると合同だと言えるでしょうか? 「AB<AC」という条件が加わると、下記URLのような状況は生まれそうもないので、合同だと言えるのではないかという気がしますが、確証が持てません。 もし、一般的に証明できるなら、どのように証明したらよいかも教えていただけると幸いです。 http://ja.wikipedia.org/wiki/%E7%94%BB%E5%83%8F:2%E8%BE%BA%E3%81%A81%E8%A7%92%E3%81%8C%E7%AD%89%E3%81%97%E3%81%84%E3%81%8C%E5%90%88%E5%90%8C%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E4%B8%89%E8%A7%92%E5%BD%A2%E3%81%AE%E4%BE%8B.png なお、これは課題やレポートではありません(念のため)。

  • 線形合同式と数列周期

    a,b,kを a≡1(mod4)、bと2との最大公約数が1、k>=2 を満たす自然数とすると、 線形合同式 x_(n+1)≡a*(x_n)+b mod 2^k ただし 0<= (x_n) <2^k で定義される0から(2^k)-1の間の整数による数列{x_n} は、任意の初期値x_0 に対して 周期が2^kであることを示せ。 わかりません。。よろしくお願いします!!

  • アクセス2003で・・・

    アクセス2003を使っています。 Aテーブルのある項目に「A」か「B」が入っています。 Bテーブルのある項目に「200M」「回1000」「不明」等、こういった類のものが入力されています。 ここから質問なのですが、Bテーブルの「200M」「回1000」等の「数字」以外の文字を無視して、残された数字が奇数か偶数か判断をアクセスの機能・関数・VBAでしたいと思います。 更に、下記の様に条件を組み、結果をアクセスの機能・関数・VBAでだしたいと思います。 ・Aテーブルの項目がAかつ、前述で奇数か偶数か判断した、Bテーブル「200M」「回1000」等が偶数ならA。 ・Aテーブルの項目がBかつ、前述で奇数か偶数か判断した、Bテーブル「200M」「回1000」等が奇数ならB。 上記の条件にあてはまらないなら、Cとういう結果を新しい項目を作ってみたいと思います。 説明がややこしいと思いますが、よろしくお願いします。

  • 合同式を使って証明したいのですが・・・

    A=an、an-1、…、a1(nやn-1や1は添え字です)という数がある時、次のことを証明したいのです。 (1)Aを3で割った余り=(an+an-1+…+a1)を3で割った余り (2)(奇数桁目の合計)-(偶数桁数目の合計)=Aを11で割った余り 合同式の性質を使えば証明できるようなのですが、いまいちよく分かりません。 どなたか解き方と回答を教えて頂ければ、と思います。どうかよろしくお願いします。

  • 合同について

    合同の定義は 整数aとbの差がmの倍数であるとき、aとbはmを法として合同 整数aとbをある整数mで割った時の余りが等しいとき、aとbはmを法として合同 このように二つありますが 実際に 4を3で割ると1余る 7を3で割ると1余る 10を3で割ると1余る そして10-7=3 7-4=3 10-4=6 と全て3の倍数になる。 となるというのはわかるのですが なぜ 整数aとbの差がmの倍数であるとき、mで割ったaとbの余りが同じになるのでしょうか。 そうなるものだから、と考えるしかないのでしょうか。 なぜうまい具合にそうなるのか理解できず、すっきりしません。 よろしくお願いします。

  • 非線形最小二乗法のmarquardt法とsimplex法に関して

    ほぼ一定の周期を持つデータがあり、それに対してy = a*cos(b*X+c)+d*X+eという形の近似式を求めたいと思っております。 いろいろ調べてみると非線形最小二乗法を利用して、求めればいいことが分かりました。 しかし非線形最小二乗法にはmarquardt法とかsimplex法などがあることが書かれていたのですが、それらの処理法が何をどうしているのか、参考書を見ても、よく分からず、脳が悲鳴をあげています。 この非線形最小二乗法のmarquardt法とsimplex法に関して、違いと求め方を素人でも分かるような形で教えていただくことができましたら、どうかご教授よろしくお願い致します。