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

C++实现高斯随机数生成器每次运行输出相同序列问题求助

问题成因
  • 你调用的srand((unsigned int)time(NULL))是C标准库rand()函数的种子设置接口,和C++<random>库中的std::default_random_engine完全独立,没有任何关联,无法为C++的随机引擎设置种子。
  • 你的std::default_random_engine实例每次启动程序时都会使用默认的固定初始值作为种子,因此每次运行生成的随机序列完全相同。
  • 主函数中重复调用srand属于冗余操作,没有任何作用。
修复方案

修改Gaussian类的构造逻辑,为std::default_random_engine设置随机种子,同时删除冗余的srand调用即可。推荐使用std::random_device获取真随机种子,修复后代码如下:

#include <cstdio>
#include <random>
#include <ctime>

class Gaussian
{
    std::default_random_engine gen;

    public:
        Gaussian()
        {
            std::random_device rd;
            gen.seed(rd());
        }

        double get(double mean, double std)
        {
            std::normal_distribution<double> nd(mean, std);
            return nd(gen);
        }
};

主函数修改为:

int main(int argc, char**argv)
{
    Gaussian g;
    int N = 10;
    double mean = 50.0;
    double std = 2.0;

    for (int i = 0; i < N; i++) {
        double value = g.get(mean, std);
        printf("%f\n", value);
    }
}

// 编译命令:g++ main.cpp

如果你的运行环境中std::random_device实现存在兼容性问题,也可以退而求其次使用时间作为种子,将构造函数中的种子设置逻辑替换为gen.seed((unsigned int)time(NULL));即可,注意该方案如果程序在1秒内多次运行,会因为时间戳相同生成相同的随机序列。

内容的提问来源于stack exchange,提问作者stackoverflowuser2010

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:51:02