在 C/C 中使用正态分布生成随机数
在各种编程应用程序中经常出现生成遵循正态分布的随机数的需求。在 C/C 中,您可以采用多种技术来实现此目的。
一种广泛采用的方法是 Box-Muller 变换。该方法涉及生成两个独立的均匀随机数并使用数学公式对其进行转换以获得正态分布值。 Box-Muller 变换在数学上是严格的,并且会产生准确的结果。
以下是如何在 C/C 中实现 Box-Muller 变换:
#include <random> #include <cmath> // Generate a random number following a Gaussian distribution double normal_rand() { static double z1; static bool ready = false; // If z1 is not ready, generate two uniform random numbers if (!ready) { double u1 = std::uniform_real_distribution<double>(0, 1)(); double u2 = std::uniform_real_distribution<double>(0, 1)(); z1 = std::sqrt(-2 * std::log(u1)) * std::cos(2 * M_PI * u2); ready = true; } // Return z1 and mark it as used ready = false; return z1; }
在上面的示例中,std:: uniform_real_distribution 生成均匀随机数,而 std::sqrt 和 std::cos 执行必要的数学运算
利用 Box-Muller 变换提供了一种简单可靠的方法来生成遵循 C/C 正态分布的随机数。通过采用这种技术,程序员可以避免使用 Boost 等外部库,并利用标准 C 库的功能。
以上是如何在C/C中生成正态分布的随机数?的详细内容。更多信息请关注PHP中文网其他相关文章!