「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ブーストなしで C/C++ で正規分布乱数を生成する方法

ブーストなしで C/C++ で正規分布乱数を生成する方法

2024 年 11 月 23 日に公開
ブラウズ:700

How to Generate Normally Distributed Random Numbers in C/C   Without Boost?

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

質問:

乱数を簡単に生成するにはどうすればよいですかBoost を使用せずに C または C で正規分布に従うライブラリ?

答え:

ボックス-ミュラー変換

ボックス-ミュラー変換は、生成するために広く使用されている方法です。一様乱数発生器からの正規分布数。ガウス分布に正確に従う値が生成されます。

ボックス-ミュラー変換の数式は次のとおりです。

x = sqrt(-2 * log(U1)) * cos(2 * π * U2)
y = sqrt(-2 * log(U1)) * sin(2 * π * U2)

ここで:

  • U1 と U2 は 0 から 1 までの一様分布乱数です。
  • x と y は、平均 0 と標準偏差の正規分布乱数です。 1

実装:

C/C で Box-Muller 変換を実装するには、次のコードを使用できます:

#include 
#include 

double box_muller() {
  std::random_device rd;  // Seed the random number generator with a system clock seed
  std::default_random_engine rng(rd());
  std::uniform_real_distribution dist(0.0, 1.0);

  double U1 = dist(rng);
  double U2 = dist(rng);

  double x = sqrt(-2 * log(U1)) * cos(2 * M_PI * U2);
  return x;
}

使用法:

正規分布乱数を生成するには、単純に box_muller() 関数を呼び出します。

double random_number = box_muller();

random_number の値は、平均 0 と標準偏差のガウス分布確率変数になります。 1.

注:

  • ボックス-ミュラー変換では 2 番目の結果 y も生成されますが、これは破棄することも、後で使用するために保存することもできます。
  • 0 以外の平均値または 1 以外の標準偏差を持つ正規分布数値を生成する必要がある場合は、結果を次の値で乗算できます。 絶え間ない。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3