如何用C++计算随机分布数据的样本均值、标准差和方差并与原参数对比
实现C++版正态分布样本统计量计算与参数对比
嘿,我来帮你搞定这个C++版本的实现!先回顾下你给出的Python代码,它生成正态分布样本并计算了总体标准差:
import numpy as np x_mu = 25 x_sigma = 5 size = 1000 x_distribution = np.random.normal(x_mu, x_sigma, size) # 计算总体标准差(除以n) test_distribution = np.std(x_distribution) print(test_distribution)
根据大数定律,当样本量足够大时(比如500或10000),样本均值、标准差会逐渐逼近原分布的mu和sigma。下面是对应的C++实现,包含样本生成、统计量计算和参数对比:
C++完整代码实现
#include <iostream> #include <vector> #include <random> #include <cmath> #include <iomanip> int main() { // 原正态分布参数 const double true_mu = 25.0; const double true_sigma = 5.0; // 样本量,可修改为500或10000进行测试 const int sample_size = 10000; // 初始化随机数生成器(用随机设备获取种子,保证每次运行样本不同) std::random_device rd; std::mt19937 gen(rd()); // 定义正态分布 std::normal_distribution<double> normal_dist(true_mu, true_sigma); // 生成样本数据 std::vector<double> samples; samples.reserve(sample_size); // 预分配空间提升效率 for (int i = 0; i < sample_size; ++i) { samples.push_back(normal_dist(gen)); } // 计算样本均值 double sum = 0.0; for (double x : samples) { sum += x; } double sample_mean = sum / sample_size; // 计算总体方差(对应np.std默认的除以n的标准差) double squared_sum = 0.0; for (double x : samples) { squared_sum += std::pow(x - sample_mean, 2); } double sample_variance = squared_sum / sample_size; double sample_std_dev = std::sqrt(sample_variance); // 输出对比结果,保留4位小数 std::cout << std::fixed << std::setprecision(4); std::cout << "原分布参数:\n"; std::cout << " 均值(mu): " << true_mu << "\n"; std::cout << " 标准差(sigma): " << true_sigma << "\n\n"; std::cout << "样本统计量(" << sample_size << "个样本):\n"; std::cout << " 样本均值: " << sample_mean << "\n"; std::cout << " 样本方差: " << sample_variance << "\n"; std::cout << " 样本标准差: " << sample_std_dev << "\n"; return 0; }
关键说明
- 随机数生成:使用C++11引入的
<random>库,std::mt19937是高效的伪随机数生成器,搭配std::normal_distribution生成符合要求的正态分布样本。如果需要复现相同样本,可以把std::random_device rd;换成固定种子,比如std::mt19937 gen(42);。 - 统计量计算:
- 样本均值是所有样本的算术平均数,公式为 $\bar{x} = \frac{1}{n}\sum_{i=1}^n x_i$
- 这里计算的是总体方差/标准差(除以样本数
n),和你Python代码中np.std()的默认行为一致。如果需要无偏样本标准差(除以n-1),只需把方差计算中的sample_size改为sample_size - 1即可。
- 大数定律验证:当你把
sample_size改成500或10000时,会发现样本量越大,计算出的均值和标准差越接近true_mu和true_sigma。
编译与运行
用支持C++11及以上的编译器编译(比如GCC、Clang或MSVC),命令示例:
g++ -std=c++11 normal_dist_stats.cpp -o normal_dist_stats ./normal_dist_stats
运行后就能看到原参数和样本统计量的对比结果啦!
内容的提问来源于stack exchange,提问作者Cleo B.
相关产品推荐
相关产品推荐

