9

一様乱数とガウス分布を生成するために書いた従来の C++ コードがあります。非常に高速な Dr. George Marsaglia によるアルゴリズムを実装しています。(私はそれらを使用して、モンテカルロの高次元積分用に数十億のサンプルを生成していました。)

ジェネレーターとディストリビューションをリファクタリングして、新しい C++11 std::random スキームで動作するようにすることをお勧めします。

std::random の拡張方法に必要な情報が含まれているチュートリアルまたは参考文献を教えてもらえますか? サンプルコードが理想的です。

アップデート。みんなの助けに感謝します。Visual C++ 2010 に同梱されている std::normal_distribution のドロップイン置換を作成しました。私のマシンでは、既定のエンジンを使用すると、置換が 26% 高速になります。違いが大きくないことに少しがっかりしていますが、それは私の問題です。:-)

4

2 に答える 2

5

N3376は最新のドラフト C++ 標準です (これは C++11 以降ですが、C++11 の優れたスナップショットです)。

すべての C++11 乱数が入っています: 26.5 乱数生成 [rand]

26.5.1.4 乱数エンジンの要件 [rand.req.eng] には、一様乱数ジェネレーターが満たす必要があるすべての要件があります。

26.5.1.6 乱数分布の要件 [rand.req.dist] には、ガウス分布を満たす必要があるすべての要件があります。

26.5.8.5.1 クラス テンプレート normal_distribution [rand.dist.norm.normal] は、標準定義のガウス分布を記述するセクションです。

C++11<random>は、乱数ジェネレーター (コンテナー) とランダム分布 (アルゴリズム) の要件を設定し、クライアントが 2 つを組み合わせて一致させることができるという点で、非常に STL に似ています。本当にとてもクールなデザインです。

申し訳ありませんが、良いチュートリアルを知りません。C++ 標準は優れたリファレンスであり、お粗末なチュートリアルです。しかし、あなたは明らかに乱数の分野で十分な教育を受けています。したがって、C++ について 1 つか 2 つ知っていると仮定すると、C++ 標準はそれほど悪くないかもしれません。

<random>ソースを熟読したい場合は、オープンソースの実装を利用できます (例として)。一例はlibc++です。彼らが要求するのは、彼らのコードを再利用する場合は、著作権表示を保持することだけです.

編集

あなたは、このチュートリアルを作成する唯一の資格を持っています。:-)

于 2012-07-31T02:54:16.347 に答える
1

C++11 での多くの提案は boost から採用されているため、boost ライブラリのソースを読むことで多くのことを学ぶことができます。

ここで rng エンジンの例のインターフェースを見てみましょう:

http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine

min max シー​​ドと operator() 機能を実装して、C++11 の有効なエンジンとして通用するかどうかを確認することから始めます。

于 2012-07-30T08:31:02.203 に答える