• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メルセンヌツイスターによる乱数の使い方)

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

このQ&Aのポイント
  • メルセンヌツイスターを使用して乱数を生成する方法について説明します。
  • mt_rand関数を呼び出すたびにシードが初期化され他の乱数が生成される問題を解決する方法を探しています。
  • namespaceの問題を解消し、初期化せずに継続して乱数を生成する方法を教えてください。

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

  • ベストアンサー
  • _kappe_
  • ベストアンサー率68% (1606/2337)
回答No.2

>上記のstaticの宣言をする作用の説明もよくわかりません。変数のstatic宣言ならばわかりますが。mt関数の宣言ならば、それをこの関数内以外で宣言できてもよさそうな気もするのです。 std::mt19937 mt(101);は関数mtではなくてmtという変数の宣言&コンストラクタ呼び出しです。 関数内でstatic変数を宣言できるのはC言語の場合と同じです。 >rand100を使う関数mt_rand()以外でmtを呼び出す、例えばmainで、方法はありませんか。 同じファイル内からアクセスできればいいのならstatic std::mt19937 mt(101);をmt_rand()の定義の外に移動すればいいでしょう。

qhtsige
質問者

お礼

ご説明ありがとうございます。 mtはコンストラクタ(まだよくわかりませんが。調べます)でユーザがここで定義している関数名なのですね。 それでこの2行とも、関数の外で最上部におけばできました。 メルセンツイスタの公式ページらしいのを見つけましたので調べてみます。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • _kappe_
  • ベストアンサー率68% (1606/2337)
回答No.1

mt_rand()内でのmtの宣言をstaticにすれば、シード101での初期化は1回しか起こりません。 static std::mt19937 mt(101);

qhtsige
質問者

お礼

ご返事ありがとうございます。 ご案内の通りすればOKであること確認できました。 ちなみに std::mt19937 static mt(101); としても何故かOKでした。 namespaceを積極的に使ったことが無く(サンプルコードなどをまねしただけ)調べてもよくわからないのですが、 rand100を使う関数mt_rand()以外でmtを呼び出す、例えばmainで、方法はありませんか。 また上記のstaticの宣言をする作用の説明もよくわかりません。変数のstatic宣言ならばわかりますが。mt関数の宣言ならば、それをこの関数内以外で宣言できてもよさそうな気もするのです。 なおc言語時代の古き人間です。

すると、全ての回答が全文表示されます。

関連するQ&A