C++生成高斯分布随机数

简单实现

在 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值