【c++】关于随机数

本文介绍了在C++中生成随机数的方法,包括使用`<cstdlib>`和`<ctime>`头文件设置随机种子,确保每次运行都能得到不同的随机数。接着详细讲解了mt19937算法用于生成更大的随机数,以及如何生成均匀分布的整数和浮点数。此外,还讨论了如何生成遵循特定期望和方差的高斯分布随机数。
摘要由CSDN通过智能技术生成

生成随机数

  1. 包含头文件cstdlib,从而可以使用srandrand
  2. 包含头文件ctime,从而可以使用time
  3. srand来设置随机种子:
    srand(1) 每次产生的随机数都一样
    srand(time(0))或者srand(time(NULL)) 在不同时刻运行程序时就会有不同的随机数
    time(0) 返回从 1970-01-01 起的到当前时刻的秒数
  4. rand()%(b-a)+a返回[a, b)之间的整数
  5. float p = rand() % 1000 / (float)(1000); 生成0~1的小数

mt19937

C++的 rand() 函数产生的随机数范围值是 0~32767 ,如果想产生很大的随就要用到 mt19937 。

mt19937 num(seed); 定义了大随机数

生成均匀分布

uniform_int_distribution 整数均匀分布 全开
uniform_real_distribution 浮点数均匀分布 半开

#include<iostream>
#include<ctime>
#include<random>
using namespace std;
int main(){
    static default_random_engine rng(time(NULL));
    static uniform_real_distribution<double> distribution(0, 100);
    cout<<distribution(rng);
}

为了避免多次调用同一对范围和引擎时每次生成的数都是一样的,需要在定义范围和引擎时将其定义为static的。

生成高斯分布

double gaussrand()
    {
        static double V1, V2, S;
        static int phase = 0;
        double X;
        if(phase == 0){
            do {
                double U1 = (double)rand() / RAND_MAX;
                double U2 = (double)rand() / RAND_MAX;
                V1 = 2 * U1 - 1;
                V2 = 2 * U2 - 1;
                S = V1 * V1 + V2 * V2;
            } while(S >= 1 || S == 0); 
            X = V1 * sqrt(-2 * log(S) / S);
        } 
        else
            X = V2 * sqrt(-2 * log(S) / S);
        phase = 1 - phase;
        return X;
    }

若指定期望为E,方差为V,则只需增加:X = X * σ + μ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值