- ベストアンサー
乱数生成、メルセンヌツイスターの使い方
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html 乱数生成にメルセンヌツイスターというものを使おうとしたのですが、 色々試してみてもいまいち使い方が分かりませんでした。 例えば0から100までの間の乱数を得たい場合などはどのように 書けばよいのでしょうか・・?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 上のコードを元に0~任意の数の乱数を得る関数を > 作ってみたら実行結果が常に同じ値になってしまいます。 > またmac_res様のコードでも実行ごとの乱数の数が全て同じでした・・・。 > > int GetRand( int max ){ i> nt i; > unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; > init_by_array(init, length); init_by_array はsrandと同じで、(擬似)乱数系列の初期化を行います。 種が同じなら、生成される乱数の値とその順番は同じものになります。 GetRandを呼び出すたびに同じ値で初期化して、同じ系列の値を とってきているのですから、値が同じになるのは当然のことです。 init_by_array (やその類似のもの)は、使用に先立って一回だけ 呼び出せば十分です。また、プログラムの実行ごとに同じ値が で続けてしまうという問題は、乱数系列の初期化を同じ値でやっている ことが原因ですので、srandを起動した時刻を基にした適当な 数値を使って呼び出すような、起動ごとに違う値でもって初期化を 行うようにすれば期待通りの値が得られるのではないでしょうか。
その他の回答 (2)
- mac_res
- ベストアンサー率36% (568/1571)
mt19937ar.cの最後にmain()が付いているので、これを書き換えれば試験が出来ます。 実際に使うには、main()を消して、init_by_array(),genrand_real2()*100.0 を使用するプログラムに組み込めばよいと思います。 int main(void) { int i; unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; init_by_array(init, length); printf("\n1000 outputs of genrand_real2()\n"); for (i=0; i<1000; i++) { printf("%10.8f ", genrand_real2()*100.0); if (i%5==4) printf("\n"); } return 0; }
お礼
解答ありがとうございます 上のコードを元に0~任意の数の乱数を得る関数を 作ってみたら実行結果が常に同じ値になってしまいます。 またmac_res様のコードでも実行ごとの乱数の数が全て同じでした・・・。 int GetRand( int max ){ int i; unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; init_by_array(init, length); return (int)(genrand_real2() * max); } int main(){ for (int i=0; i < 10; i++) { printf("%d\n", GetRand(100) ); } }
- sakusaker7
- ベストアンサー率62% (800/1280)
通常の rand/randomといった関数の使い方、またそれらを使った場合の >例えば0から100までの間の乱数を得たい場合などはどのように の手順についてはわかっていますか? 初期化して、乱数を得るという部分では呼び出す関数の違いがあっても 基本は同じですから、「いまいち使い方がわからない」というのが いまいち理解できません。
お礼
解答ありがとうございます。 初期化して任意の範囲の乱数を得る部分を関数化しようと思ったのですが、 なぜか何度やっても同じ値にしかならないので質問させて頂きました・・。 unsigned long init[4]={0x123, 0x234, 0x345, 0x456} の部分を unsigned long init[4]={rand(), rand(), rand(), rand()} などにすると上手くいったのですが、正しい手順というか 初期化の仕方がどうも理解できないのです。
補足
randについては把握しています。 ただ、MTの場合初期化のキーが必要らしく、randとは 基本的な使い方が違うのではと考えて質問してみました。
お礼
分かりやすい解説ありがとうございます。 うまくいきました。本当に助かりました。