简单实现
在 C++ 中,可以使用 头文件中的功能来生成正态分布(高斯分布)随机数。以下是一个示例,展示如何使用 C++11 及以上版本的标准库生成正态分布随机数。
#include <iostream>
#include <random>
#include <cmath> // 用于 std::sqrt// 函数:生成正态分布随机数
double generateNormalRandom(double mean, double variance) {static std::random_device rd; // 随机设备,用于生成种子static std::mt19937 gen(rd()); // 梅森旋转算法的随机数生成器double stddev = std::sqrt(variance); // 计算标准差std::normal_distribution<double> distribution(mean, stddev); // 创建正态分布对象return distribution(gen); // 生成并返回随机数
}int main() {double mean = 0.0; // 均值double variance = 1.0; // 方差// 生成并输出随机数for (int i = 0; i < 10; ++i) {double random_number = generateNormalRandom(mean, variance);std::cout << random_number << std::endl; // 输出随机数}return 0;
}
运行结果
下面解释一下上述代码中的static
设置(由GPT生成)
1. static std::random_device rd;
目的
- 保持随机设备的状态:
std::random_device
用于生成种子。通过将其声明为static
,该对象在第一次调用generateNormalRandom
函数时初始化,并在所有后续调用中保持其状态。
效果
- 避免重复初始化:如果没有
static
,每次调用generateNormalRandom
时都会创建一个新的std::random_device
实例,这样会导致额外的开销,并且每次生成的种子可能会相似,从而影响随机数的质量。 - 提高性能:由于
rd
只在第一次调用时创建,后续调用直接使用这个实例,减少了开销。
2. static std::mt19937 gen(rd());
目的
- 保持随机数生成器的状态:
std::mt19937
是一种高效的随机数生成算法。将其设置为static
确保该生成器的状态在多个调用之间保持一致。
效果
- 避免重复初始化:如果没有
static
,每次调用generateNormalRandom
都会创建一个新的std::mt19937
实例,导致其状态重置为初始状态。这将影响随机数的生成,使得每次调用产生的随机数序列相同。 - 实现持续性:通过保持随机数生成器的状态,可以生成更高质量的随机数序列,这对于统计模拟和其他需要随机性的应用非常重要。
总结
使用 static
关键字的效果是确保在函数调用之间保持状态,这样可以提高性能并确保生成的随机数序列的多样性和随机性。这样做可以避免在每次函数调用时进行不必要的初始化,从而使得随机数生成更加高效和有效。
固定随机种子
似乎只能在运行generateNormalRandom函数之前将gen初始化,然后传入gen
#include <iostream>
#include <random>
#include <cmath>// 函数:生成正态分布随机数
double generateNormalRandom(double mean, double variance, std::mt19937& gen) {double stddev = std::sqrt(variance); // 计算标准差std::normal_distribution<double> distribution(mean, stddev); // 创建正态分布对象return distribution(gen); // 生成并返回随机数
}int main() {double mean = 0.0; // 均值double variance = 1.0; // 方差unsigned int fixedSeed = 42; // 固定随机种子// 使用固定种子初始化随机数生成器std::mt19937 gen(fixedSeed);std::cout << "Generating 10 random numbers with fixed seed:" << std::endl;for (int i = 0; i < 10; ++i) {double random_number = generateNormalRandom(mean, variance, gen);std::cout << random_number << std::endl; // 输出随机数}return 0;
}