ホームページ >バックエンド開発 >C++ >Box-Muller 変換を使用して C/C で正規分布乱数を生成するにはどうすればよいですか?

Box-Muller 変換を使用して C/C で正規分布乱数を生成するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-30 12:19:26348ブラウズ

How to Generate Normally Distributed Random Numbers in C/C   using the Box-Muller Transform?

C/C での正規分布乱数の生成

C または C で正規分布に従う乱数を生成することは頻繁に行われるタスクですさまざまな計算および統計アプリケーションで使用されます。これは、ボックス-ミュラー変換を使用すると効果的に実現できます。ボックス-ミュラー変換は、2 つの一様乱数を利用して正規分布乱数のペアを生成する広く採用されている手法です。

ボックス-ミュラー変換は、次のような単純な数式に依存しています。

x = sqrt(-2 * ln(u1)) * cos(2 * pi * u2)
y = sqrt(-2 * ln(u1)) * sin(2 * pi * u2)

ここで、u1 と u2 は、範囲 [0, 1] で生成された 2 つの独立した一様乱数です。これら 2 つの方程式は、2 つの独立した確率変数 x と y を定義し、平均ゼロと単位分散の正規分布に従います。

このメソッドを C/C で実装するには、次の手順を実行できます。

  1. 標準ライブラリヘッダー をインクルードします。 rand() 関数にアクセスするため。
  2. 範囲 [0, 1) に従う一様なランダム double を生成する関数を定義します。これは以下を使用して実行できます:
double rand0to1() {
    return rand() / (RAND_MAX + 1.0);
}
  1. Box-Muller 変換関数を実装します:
pair<double, double> box_muller() {
    double u1 = rand0to1();
    double u2 = rand0to1();
    double x = sqrt(-2.0 * log(u1)) * cos(2.0 * M_PI * u2);
    double y = sqrt(-2.0 * log(u1)) * sin(2.0 * M_PI * u2);
    return {x, y};
}
  1. box_muller 関数を呼び出して生成します必要に応じて正規分布する乱数。

この方法は効果的です。外部ライブラリを必要とせずに、正規分布に従う乱数を生成します。

以上がBox-Muller 変換を使用して C/C で正規分布乱数を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。