• 締切済み

乱数 メルセンヌツイスターについて

メルセンヌツイスター法(MT法)について少し調べることになったのですが、メルセンヌツイスターのサイトにC言語のソースがあったので動かしてみました。 確かに乱数が発生するのですが、ソースをみてもどういう動きで乱数を生成してるのかがわかりません。 メルセンヌツイスターはどうやって乱数をつくりだしているのでしょうか? わかる方がいらっしゃいましたら、教えてください。

みんなの回答

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

Mersenne Twister で検索すると論文が見つかりますね. それを読めばいいんじゃないでしょうか.

関連するQ&A

  • 乱数生成、メルセンヌツイスターの使い方

    http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html 乱数生成にメルセンヌツイスターというものを使おうとしたのですが、 色々試してみてもいまいち使い方が分かりませんでした。 例えば0から100までの間の乱数を得たい場合などはどのように 書けばよいのでしょうか・・?

  • メルセンヌツイスターによる乱数の使い方

    メルセンヌツイスターによる乱数を生成したいのですが、下記コードにすると、mt_rand関数を呼ぶたびにシードが初期化され他乱数が生成されます。 やりたいことは、main関数で一度シード101で初期化した後は、mt_rand関数内では、初期化することなく継続した乱数を生成したいのです。 そのためa_mt_rand関数のようにすると、mtが定義されていないとなるエラーとなります。 namespaceの問題と思うのですが、色々試してみましたが、できませんでした。 どのようにすればできるでしょうか。 vc++11、windows11 使用 参考サイト C++ 乱数ライブラリ std::random の使い方 リンクはうまく貼れませんでした。 #pragma hdrstop #include <iostream> #include <stdio.h> #include <random> using namespace std; void mt_rand(void); int main(int argc, char *argv[]) { int ptr; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("ptr=%d\n",ptr); mt_rand(); } void mt_rand(void) { int ptr=0; std::mt19937 mt(101); // メルセンヌツイスターの32ビット版、引数は初期シード std::uniform_int_distribution <> rand100(0, 100); // [0, 99] 範囲の一様乱数 ptr = rand100(mt); printf("%d\n",ptr); } void a_mt_rand(void) { int ptr=0; ptr = rand100(mt); printf("%d\n",ptr); }

  • メルセンヌツイスターを使った2次元乱数

    Mersenne Twisterを使って2次元の乱数を下記のように 生成しています。 1. 乱数を取得. x座標の値とする。 2. 1)で用いた乱数生成を利用して乱数を取得. y座標の値とする。 こうした作成したx,y座標のデータを見ますと、一様性が あまりないように見えます。 これは、2次元の乱数の扱いが間違っているのでしょうか? あるいは、周期が非常に長い乱数でも、2次元的に一様性を 保つためには、凖乱数を使うのがいいのでしょうか。

  • メルセンヌツイスターが使えない

    C++でメルセンヌツイスターのランダムクラスをstaticで作ろうとしたのですがクラスの中に変数を宣言しているにもかかわらず "private: static unsigned int * MyRando::mt" (?mt@MyRando@@0PAIA)" は未解決です。 というエラーが出ました。 このエラーはどうすれば消せるのでしょうか? ちなににstaticをつけない普通のクラスとして宣言すれば使えました。

  • 乱数発生ルーチンの使い方について

    数値計算において一様乱数を発生させるルーチンがいろいろあります。ソースが公開されているものやコンパイラが提供したりするものです。それらを利用する場合、乱数発生のシーズ(種)を与えてそれに応じて動作するというものが多いだろうと思います。そこで質問ですが、10000個の乱数を1回発生させる場合と100個の乱数を100回発生させる場合とで乱数の感じがかなり違います。いずれの場合も100×100の2次元データ(エクセルのシート状)として出力して作図したらその違いが簡単に分かります。この違いの原因はシーズの与え方が1回と100回という違いだろうと思います。100回のシーズの与え方にパターンが出来てしまうからだと思われます。例えば時間を使ってシーズを与えなおすことも考えられますが、今時のPCだとあっという間なのでシーズが同じだから、同じ乱数が100個できてしまいます。乱数を繰り返し発生させるときにその繰り返しの中でパターン化された乱数にならないように発生させる方法がないでしょうか。シーズが要らない乱数生成ルーチンとかですが。あるいはシーズをランダムに取得する方法が含まれたルーチン(シーズがないように見える)などです。あるいは本当にないものなど。メルセンヌツイスターはどうなのでしょうか。一応、フォートランでの利用を考えていますが、言語依存の問題ではないかもと思いますが。 よろしくお願いします。

  • (初心者)乱数のことで

    使っているソフトはVisual c++です C言語で乱数を使うときにrandom関数を使ったんですが 帰ってくる値が一定なのでネットで検索したら 「メルセンヌ・ツイスタ」 を進めているサイトが多かったので ヘッダーファイルをダウンロードしてみたのですが メルセンヌ・ツイスタを プログラムに組み込む時どのように記述すればいいのか いろいろ試したのですがわかりませんでした メルセンヌ・ツイスタを組み込む構文の仕方を教えてください

  • メルセンヌ・ツイスタの乱数生成範囲指定(C++)

    メルセンヌ・ツイスタで乱数の生成範囲を指定したいのですが 以下の方法以外でもっと厳密に乱数を生成できる方法がわかる方いますか? int n; n = genrand_int32() % 10; 上記では0~9までの乱数を求める事が出来ますが、余りは下二桁のみに依存するので 精度が低いのでは?と考えます。 分かる方いましたら宜しくお願いします。

  • 乱数の生成法

    乱数を生成するようなショートプログラムを知りたいのですが、 どんなものがありますか? C言語でお願いします。

  • ある乱数生成法により,生成した最初の乱数の値は固定するか確かめて頂きた

    ある乱数生成法により,生成した最初の乱数の値は固定するか確かめて頂きたいです. 0.0から1.0までの一様乱数を発生させる方法です. C言語のコードは以下に載せます. #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define MASK 123459876 float ran0(long *idum) { long k;   float ans; *idum ^= MASK; k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; ans=AM*(*idum); *idum ^= MASK; return ans; } この乱数生成法をBVAで,計算の中で繰り返し用いようとしています. idumを任意の整数値に設定・再設定すれば乱数列が初期化されると書いてあったため,idumの値を変えてみましたが,生成された乱数の最初の値は固定されたままでした. そこで,もともとこの乱数生成法がそのようになっているのかを教えて頂きたいです. よろしくお願いします.

  • 乱数について

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

専門家に質問してみよう