首页  >  文章  >  后端开发  >  如何在没有Boost的情况下在C/C中生成正态分布的随机数?

如何在没有Boost的情况下在C/C中生成正态分布的随机数?

Patricia Arquette
Patricia Arquette原创
2024-11-23 00:55:16906浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn