You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:17:56