温馨提示×

C++ Random库如何实现正态分布

c++
小樊
126
2024-07-21 03:10:58
栏目: 编程语言

C++的标准库并没有直接提供生成正态分布随机数的函数,但可以通过一些数学库来实现。一种常用的方法是使用Box-Muller算法来生成正态分布的随机数。

Box-Muller算法的基本思想是利用两个独立的均匀分布随机数来生成正态分布的随机数。具体步骤如下:

  1. 生成两个在0到1之间的均匀分布随机数u和v。
  2. 计算两个正态分布随机数x和y:
    x = sqrt(-2 * log(u)) * cos(2 * PI * v)
    y = sqrt(-2 * log(u)) * sin(2 * PI * v)
    
    其中,log表示自然对数,sqrt表示平方根,cos和sin表示余弦和正弦,PI表示圆周率。
  3. x和y即为符合标准正态分布的随机数,若需要生成具有特定均值和标准差的正态分布随机数,则可以通过如下公式进行变换:
    z = mean + stddev * x
    
    其中,mean为均值,stddev为标准差。

以下是一个使用Box-Muller算法生成正态分布随机数的示例代码:

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

在上面的代码中,我们定义了一个函数generate_normal_random来生成正态分布随机数,然后在main函数中调用该函数来生成10个均值为0,标准差为1的正态分布随机数。

0