- ベストアンサー
合同混合法・乗算合同法の実際の周期について
- 「混合合同法」と「乗算合同法」を用いた乱数の発生実験を行っています。
- 実際に周期が異なる理由や乗算合同法で奇数しか返されない理由について知りたいです。
- また、Cでプログラミングして同一の値が返される回数を表示する方法も教えてほしいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- 線形合同法(乗算型)による乱数発生法
javaを使って乱数を発生するプログラムを作っています。 線形合同法(乗算型)に基づいて発生させようと思うのですが、疑問点があり質問しました。 乱数発生の漸化式 X(i+1)= a*X(i) (mod M) で、a,M,そして乱数の初期値を決めたいのですが、ネットを使って調べたところ、 a=16807 M=2147483647 が良いという記述がありました。 しかし、これをプログラムに反映させるとintの範囲から出てしまうため、検出値にマイナスが入ってしまいます。 また乱数の初期値に関する記述が見つからなかったので、どのような値にすべきか悩んでいます。 また、検出値をある範囲に(例えば100000まで)にしたい場合は、M=100000にすればいいと思うのですが、その場合のaや初期値の値はどのように決定したらよいのでしょうか? 教えて下さい。よろしくお願いします。
- ベストアンサー
- Java
- 混合合同法による一様乱数
今、プログラム言語で混合合同法で一様乱数を発生させようとがんばっているのですが、まず、混合合同法の式は Xn+1 = a*Xn + b(MOD L) てな感じじゃないですか?まず分からないのは、(MOD L)です。Lで割った余りが。。って習った覚えがあるのですが、何をLでわるのですか?もしbをLでわるなら、bには何を初期値として入れればいいのですか?aは素数もしくは5の奇数乗、Lは10の乗数って分かってます。bとはいったい。。教えて下さい。
- ベストアンサー
- 数学・算数
- 線形合同法の欠点について
線形合同法の欠点について 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)」と結果が出ています。欠点の項目で書かれてあることと違うじゃんと思って、この矛盾について検索しまくって調べたのですが、よく理解できませんでした。 よろしければ教えていただけないでしょうか?
- ベストアンサー
- 数学・算数
- 合同について
合同の定義は 整数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の余りが同じになるのでしょうか。 そうなるものだから、と考えるしかないのでしょうか。 なぜうまい具合にそうなるのか理解できず、すっきりしません。 よろしくお願いします。
- ベストアンサー
- 数学・算数
- Verilogでモンゴメリ乗算
私はVerilogについてはド素人で全くと言っていいほど書くことができません。そこに仕事上でVerilogでモンゴメリ乗算をしなくてはならなくなりました。どうかわかる方はこの以下のアルゴリズムを利用してプログラムを教えてください。お願いします。 まずはそのアルゴリズムを紹介します。 [モンゴメリ乗算アルゴリズム] Input: N,0<A<N,0<B<N,V 前計算: V=-N-1mod2r output: M=A・BmodN Step 1:Q=A・B・VmodR R=2r Step 2:M=AB+QN Step 3: M=M/R 注.前計算,step1の2rは“2のr乗”です。また前計算の-N-1は “-Nの-1乗”のことです。 ビット数は全て8bitでお願いします。
- 締切済み
- その他(プログラミング・開発)
- C言語に詳しい方お願いします。break文によってループをどのように脱出できるのか等。
質問1.自分で簡単なプログラムを作ってみて簡単な実験をしてみたのですが,break;を使うとループをすべて抜けるのではなくいくつかループがある場合『一番内側のループを抜ける』ということでいいのでしょうか? 例えば do { }while() while(){ } for(i=0;i<N;i++) のループにはすべてbreak;は通じるのでしょうか?この他にbreak;が使えるループはありますか? 2.これも自分で試しに実験してみたのですが, #define R (double)rand()/32767.0 としておいて 例えば, a=sin(R); b=a; のように使用した場合, a=sin(R)の部分では乱数が新たな値に更新されるが, b=aの部分では乱数が新たな値に更新されない感じがします。 結論:Rが見える形で含まれていれば乱数の値は更新され,Rが見えない形で含まれていると乱数の値は更新されない。 ってことでしょうか? これは#defineの部分に何か秘密があるような気がします。詳しい方回答よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 名前なのですが・・・
「線形合同法を用いた擬似乱数を発生させるために写真の式を用いた。この式を用いると0~M-1までの整数が周期Mで一回ずつ現れます。このような乱数は何と呼ばれますか?」 という問題なのですが、いろいろ調べてはいるのですがわかりません。 回答おねがいします。
- ベストアンサー
- その他([技術者向] コンピューター)
- 2進数の乗算と除算
先日、桁上がりについて質問させていただいた者です。 加算と減算はなんとか完成したのですが、乗算と除算になって混乱してしまいました。 二進数の乗算、除算はビットシフトと関係がありますが、私の作っているものの場合はどのようなソースコードにすればよいでしょうか? (ちなみに、bの値は2のべき乗に限定しています。) int main(void) { int a,b,i; int x[8],y[8]; puts("二つの符号なし整数を入力してください。(ただしa>bとし、bは2のべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); printf("\n"); /*二進数の形に変換*/ for(i=0;i<=7;i++){ x[i]=a%2; a=a/2; y[i]=b%2; b=b/2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for(i=7;i>=0;i--){ printf("%d",x[i]); } puts(""); printf("b="); for(i=7;i>=0;i--){ printf("%d",y[i]); } printf("となります。\n\n"); return(0); }
- ベストアンサー
- C・C++・C#
お礼
ご回答ありがとうございます。 無事解決いたしました。このことを参考に数学を取り入れ考察しなおしたところ私の思い違いをしていた点も挙がってまいりました。 今回はお世話になりました。