C++获取随机数的办法

最近学了下随机获取随机数的办法,现在来总结一下。
一、第一种是C语言的办法,利用rand()库函数随机产生一个数,但用rand()产生随机数会有几个问题:
1.有偏差的分布
2.伪随机序列
3.获得种子
rand()函数产生的随机数是伪随机的,即程序运行一次后产生了一个随机数,但是再次运行次程序时,产生的还是之前那个随机数。无论伪随机数序列有多么好,除非每次在程序启动时用不同的初始值来开始这个序列,否则每次产生的随机数都是一样的,显然,解决这个问题的简单办法就是从外部源获取此初始值,即种子,最方便的方法就是获取系统时间,确保每次程序运行时有不同的种子。

#include<iostream>
#include<ctime>  //time()包含在ctime头文件中
#include<cstdlib>  //rand()和srand()包含在cstdlib头文件中
int main()
{
    int a[10];
    srand(time(nullptr));//srand()用于初始化随机数发生器
    for(int i = 0; i < 10; i++)
        a[i]=rand()%100+1;
    for(int i = 0; i < 10; i++)
        std::cout << a[i] ;
    std::cout << std::endl;
    std::cin.ignore();
    return 0;
}

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

每次生成的随机数序列都是不一样的,下面说下生成随机数的范围问题,上面是运用系统生成的随机数对100取模,从而可以获得0~99范围的数,后面在加个一(rand()%100+1)则可以产生1~100的随机数。

int r = rand() % n +1;//产生1~n范围的随机数。

还有另外一种控制范围的算法:

int r = (int)(m + (n - m) * rand()/RAND_MAX);//产生范围为[m,n]的随机数。

二、下面还有另外的产生随机数序列的方法,在使用C++随机库时,得做以下选择:
1.选择一个引擎
2.选择一个初始种子
3.选择分布
在使用这些类之前,得先包含random头文件,还要包含ctime

#include<iostream>
#include<ctime>
#include<random>
int main()
{
    time_t seed = time(nullptr);
    std::default_random_engine eng(seed);//创建一个引擎。命名为eng,并用指定种子初始化随机数序列。
    std::uniform_int_distribution<int> dist(1, 6);//创建一个分布,。
    std::cout << dist(eng) << std::endl;
    std::cout << dist(eng) << std::endl;
    std::cout << dist(eng) << std::endl;
    std::cout << dist(eng) << std::endl;
    return 0;
}

这里写图片描述
产生了4个范围在1~6内的随机数。
第一步选择了一个种子,
第二步创建一个随机引擎:
default_random_engine 引擎名称 (种子值)
接下来是创建一个分布:
uniform_int_distribution<类型> 分布名称(上限,下限)
这种分布是用来产生一个整数的,但不仅仅是int,还可以是其他任意整数类型 short ,long 都行,参数中上下限是随机数的范围。
最后,为了得到一个随机数,需要进行以下函数调用:
分布名称(引擎名称) 如上面的dist(eng).

最后指出,头文件random里声明的所有符号都是std namespace中的一部分,所以在前面要加std::。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值