”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在不使用 Boost 的情况下在 C/C++ 中生成正态分布的随机数?

如何在不使用 Boost 的情况下在 C/C++ 中生成正态分布的随机数?

发布于2024-11-23
浏览:448

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

用法:

要生成正态分布的随机数,只需调用 box_muller() 函数即可:

double random_number = box_muller();

random_number 的值将是均值为 0、标准差的高斯分布随机变量1.

注:

  • Box-Muller 变换还会产生第二个结果 y,但可以将其丢弃或保存以供以后使用。
  • 如果您需要生成均值不为 0 或标准差不为 1 的正态分布数字,您可以将结果乘以 持续的。
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3