」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在不使用 Boost 的情況下在 C/C++ 中產生常態分佈的隨機數?

如何在不使用 Boost 的情況下在 C/C++ 中產生常態分佈的隨機數?

發佈於2024-11-23
瀏覽:153

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

在C/C中產生常態分佈的隨機數

問題:

如何輕鬆產生隨機數在不使用Boost 的情況下遵循C 或C 的常態分佈函式庫?

答案:

Box-Muller 變換

Box-Muller 變換是一種廣泛使用的生成方法來自均勻隨機數產生器的常態分佈數字。它產生的值精確地遵循高斯分佈。

Box-Muller 轉換的數學公式如下:

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;
}

用法:

用法:
double random_number = box_muller();

要產生常態分佈的隨機數,只要呼叫box_muller() 函式即可:

double random_number = box_muller (); random_number 的值將是均值為0.標準差的高斯分佈隨機變數1.

  • 註:
Box-Muller 轉換也會產生第二個結果y,但可以將其丟棄或保存以供以後使用。

How to Generate Normally Distributed Random Numbers in C/C   Without Boost?
如果您需要產生平均值不為 0 或標準差不為 1 的常態分佈數字,您可以將結果乘以 持續的。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3