首頁 > 後端開發 > C++ > 主體

如何在沒有Boost的情況下在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的常態分佈

答案:

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 <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.

注意:

  • Box-Muller 轉換也會產生第二個結果y,但可以將其丟棄或保存以供以後使用。
  • 如果您需要產生平均值不為 0 或標準差不為 1 的常態分佈數字,您可以將結果乘以常數。

以上是如何在沒有Boost的情況下在C/C中產生常態分佈的隨機數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板