C++ Random庫(kù)如何實(shí)現(xiàn)正態(tài)分布

c++
小樊
127
2024-07-21 03:10:58

C++的標(biāo)準(zhǔn)庫(kù)并沒(méi)有直接提供生成正態(tài)分布隨機(jī)數(shù)的函數(shù),但可以通過(guò)一些數(shù)學(xué)庫(kù)來(lái)實(shí)現(xiàn)。一種常用的方法是使用Box-Muller算法來(lái)生成正態(tài)分布的隨機(jī)數(shù)。

Box-Muller算法的基本思想是利用兩個(gè)獨(dú)立的均勻分布隨機(jī)數(shù)來(lái)生成正態(tài)分布的隨機(jī)數(shù)。具體步驟如下:

  1. 生成兩個(gè)在0到1之間的均勻分布隨機(jī)數(shù)u和v。
  2. 計(jì)算兩個(gè)正態(tài)分布隨機(jī)數(shù)x和y:
    x = sqrt(-2 * log(u)) * cos(2 * PI * v)
    y = sqrt(-2 * log(u)) * sin(2 * PI * v)
    
    其中,log表示自然對(duì)數(shù),sqrt表示平方根,cos和sin表示余弦和正弦,PI表示圓周率。
  3. x和y即為符合標(biāo)準(zhǔn)正態(tài)分布的隨機(jī)數(shù),若需要生成具有特定均值和標(biāo)準(zhǔn)差的正態(tài)分布隨機(jī)數(shù),則可以通過(guò)如下公式進(jìn)行變換:
    z = mean + stddev * x
    
    其中,mean為均值,stddev為標(biāo)準(zhǔn)差。

以下是一個(gè)使用Box-Muller算法生成正態(tài)分布隨機(jī)數(shù)的示例代碼:

#include <iostream>
#include <cmath>
#include <cstdlib>

double generate_normal_random(double mean, double stddev) {
    double u = (double)rand() / RAND_MAX;
    double v = (double)rand() / RAND_MAX;
    
    double x = sqrt(-2 * log(u)) * cos(2 * M_PI * v);
    
    return mean + stddev * x;
}

int main() {
    srand(time(NULL));
    
    double mean = 0.0;
    double stddev = 1.0;
    
    for (int i = 0; i < 10; i++) {
        double random = generate_normal_random(mean, stddev);
        std::cout << random << std::endl;
    }
    
    return 0;
}

在上面的代碼中,我們定義了一個(gè)函數(shù)generate_normal_random來(lái)生成正態(tài)分布隨機(jī)數(shù),然后在main函數(shù)中調(diào)用該函數(shù)來(lái)生成10個(gè)均值為0,標(biāo)準(zhǔn)差為1的正態(tài)分布隨機(jī)數(shù)。

0