首頁 >後端開發 >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 中產生遵循常態分佈的隨機數是一項常見任務在各種計算和統計應用。使用 Box-Muller 變換可以有效地實現這一點,Box-Muller 變換是一種廣泛採用的技術,它利用兩個均勻隨機數來產生一對正態分佈的隨機數。

Box-Muller 變換依賴於一個簡單的數學公式:

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

其中 u1 和 u2 是在 [0, 1] 範圍內產生的兩個獨立的均勻隨機數。這兩個方程式定義了兩個獨立的隨機變數 x 和 y,它們遵循平均值為零且單位變異數為零的常態分佈。

要在 C/C 中實作此方法,可以採取以下步驟:

  1. 包含標準函式庫頭檔 用於存取 rand() 函式。
  2. 定義一個函數來產生範圍 [0, 1) 後的均勻隨機雙精度值。這可以透過以下方式完成:
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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn