ブーストなしでC/Cで正規分布乱数を生成するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-23 00:55:16
オリジナル
905 人が閲覧しました

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 <cmath>
#include <random>

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<double> 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 以外の標準偏差を持つ正規分布数値を生成する必要がある場合は、結果を乗算できます。定数で指定します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート