Twitterに投稿 はてなブックマークに追加 Google Bookmarksに追加

目次 >> C、C++ >> Tips

正規分布の乱数を得るには?

一様乱数からボックス=ミューラー法(Box-Muller transform)を使うことによって、2つの独立した正規乱数(g1、g2)を得ることができる。

生成方法は2つあり、通常の方法は三角関数を計算する必要があるので、rand関数が十分速い場合は次の極座標法が適当である。

double a1,a2,b;
do
{
    a1=2.0*rand()/RAND_MAX-1.0;
    a2=2.0*rand()/RAND_MAX-1.0;
    b=a1*a1+a2*a2;
}while(b >= 1.0);
b = sqrt( (-2.0 * log( b ) ) / b );
double g1 = a1 * b;
double g2 = a2 * b;
g1*=std+mean;
g2*=std+mean;

なお、rand()はあまり質の良い乱数ではないので、より高精度な乱数が必要な場合は、XORSHIFTなど別のアルゴリズムで生成された物を使うとよい。


最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて20.04、21.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2021 Chikuma Engineering Co., Ltd. All Rights Reserved.