问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++生成随机数的两种方法详解

创作时间:
2025-03-13 13:24:08
作者:
@小白创作中心

C++生成随机数的两种方法详解

引用
CSDN
1.
https://m.blog.csdn.net/unoreason/article/details/131655928

计算机所产生的随机数其实并不是真正随机的,而是伪随机的。当我们在使用rand()生成随机数时得到的实际上是从由随机数种子生成的一个数字序列中生成的一个数,该数字序列的长度一般是65535。也就是说一个固定的随机数种子生成的数字序列长度一般是65535,当我们在这个数字序列中生成随机数时,如果已经得到了65535个随机数那么接下来生成的随机数会和之前的随机数重复。简单点说就是如果不改变随机数种子的话,那么生成随机数的过程就是每次在一个固定的数字序列中拿出一个数(而且经过我多次试验发现每次还都是按顺序生成的,即有规律可循)。

使用cstdlib库

第一步:使用srand()设置随机数种子值(如果不设置的话会默认随机数种子为1即srand(1))。

用法:srand(unsigned int seed)    //初始化随机数发生器
通常用srand(time(0))来初始化,time(0)为1970年1月1日到现在的秒数,这样在每次运行代码时可以使数字序列都不相同。

第二步:使用rand()产生随机数。

用法:rand()    //随机数发生器
产生一定范围随机数的通用表示公式:
(1)要取得[a,b)的随机整数:(rand()%(b-a))+a;
(2)要取得[a,b]的随机整数:(rand()%(b-a+1))+a;
(3)要取得(a,b]的随机整数:(rand()%(b-a))+a+1;    //通用公式:a+rand()%n:其中a是范围的起始值,n是整数的范围。
(4)要取得a到b之间的随机整数的另一种方式:a+(int)b*rand()/(RAND_MAX+1)
(5)要取得0~1之间的浮点数:rand()/double(RAND_MAX)

使用random库

在C++11以前,C和C++都使用相同的方式来生成随机数。而C++11提供了随机数库,其中包括随机数引擎类随机数分布类

随机数引擎类

//一般用default_random_engine类产生随机非负数(不推荐直接使用)
#include<iostream>
#include<ctime>
#include<random>
using namespace std;
int main(){
    default_random_engine e;
    e.seed(time(0));
    for(int i=0;i<10;i++){
        cout<<e()<<endl;
    }
    
    system("pause")
    return 0;
}

输出结果:

随机数分布类

产生均匀分布的整数:uniform_int_distribution
#include<iostream>
// #include<cstdlib>
#include<ctime>
#include<random>
using namespace std;
int main(){
    default_random_engine e;
    uniform_int_distribution<int> u(1,10);  //左闭右闭区间
    e.seed(time(0));
    for(int i=0;i<10;i++){
        cout<<u(e)<<endl;
    }
    system("pause");
    return 0;
}

输出结果:

产生均匀分布的实数:uniform_real_distribution
#include<iostream>
// #include<cstdlib>
#include<ctime>
#include<random>
using namespace std;
int main(){
    default_random_engine e;
    uniform_real_distribution<double> u(1.0,2.0);  //左闭右闭区间
    e.seed(time(0));
    for(int i=0;i<10;i++){
        cout<<u(e)<<endl;
    }
    system("pause");
    return 0;
}

输出结果:

产生正态分布的实数:normal_distribution
#include<iostream>
// #include<cstdlib>
#include<ctime>
#include<random>
using namespace std;
int main(){
    default_random_engine e;
    normal_distribution<double> u(0,1);  //均值为0,标准差为1
    e.seed(time(0));
    for(int i=0;i<10;i++){
        cout<<u(e)<<endl;
    }
    system("pause");
    return 0;
}

输出结果:

生成二项分布的布尔值:bernoulli_distribution
#include<iostream>
// #include<cstdlib>
#include<ctime>
#include<random>
using namespace std;
int main(){
    default_random_engine e;
    bernoulli_distribution u(0.6);  //生成1的概率是0.6
    e.seed(time(0));
    for(int i=0;i<10;i++){
        cout<<u(e)<<endl;
    }
    system("pause");
    return 0;
}

输出结果:

参考内容

【小沐学C++】C++11 实现随机数生成(Windows、Linux)
C++ rand 与 srand 的用法

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号