【整理】C、C++随机数生成方法

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 【整理】C、C++随机数生成方法

C、C++中我们可能会有这种需求,生成一些随机数供使用。

首先我们来看下演示效果

生成1~10的随机数

random_number

 

下面开讲:

在C++中使用

rand()

这个函数去产生随机数,rand() 函数定义如下:

#include <stdlib.h>
int rand();

rand()函数无需参数,它返回一个伪随机数,范围是0~RAND_MAX,RAND_MAX的值是2147483647。那么什么是伪随机数?其实伪随机数就是并不是真正的随机数,它只是按照固定的几率从0~RAND_MAX里选择一个,其实和真正的随机数很类似,算是计算机模拟的随机数。

例如,下面的代码:

cout << rand() << endl;
cout << rand() << endl;
cout << rand() << endl;

将会输出:

1804289387
484848482
16384

上面演示的随机数范围是0~RAND_MAX。那么假如我们想生成0~10的随机数改如何做?如果懂一点编程的话,那么我们可以使用“ % ”操作符来进行生成1~10的随机数。

因为我们知道任何整数与10取模操作,余数将会是0~9,所以,我们让随机数与10取模操作,那么将会产生0~9的随机数,如下:

1804289387 % 10 = 7
484848482 % 10 = 2
16384 % 10 = 4

那么,如果我们想产生1~10的随机数,直接在生成的余数加1就可以将随机余数范围变为1~10,所以最终结果就是:

cout << (rand() % 10) + 1 << endl;

如果运行这段代码多次,我们很快就会发现一个问题,每次生成的数字都一样,具体原因:

从rand()函数生成的随机数实际上并不是随机数。 维基百科更好地解释了伪随机数发生器的含义:确定性随机位发生器。 每次调用rand()时,都会生成种子和/或最后一个随机数(C标准没有指定使用的算法,尽管C ++ 11有指定一些常用算法的功能),运行 对这些数字进行数学运算,并返回结果。 所以如果种子状态每次都是相同的(就像你不用真正的随机数字调用srand一样),那么你总是会得到相同的“随机”数字。

可以参考:https://stackoverflow.com/questions/9459035/why-does-rand-yield-the-same-sequence-of-numbers-on-every-run

如果我们想生成每次都不一样的数字,那么我们需要设置随机种子。设置随机种子通过函数:srand() 进行随机数种子设置:

void srand(int seed);

请记住非常重要的一点:随机数种子函数只需要在程序最开始只需要调用一次即可!

我们通常把当前时间值作为种子随机数,time() 函数返回当前的计算机时间。time(NULL)将会返回当前计算机时间的秒数。

#include <time.h>
srand(time(NULL));
cout << (rand() % 10 + 1) << endl;

通过上述代码,我们就可以每次得到一个不同的随机数了。

最后附上我们演示demo的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define random(x) (rand()%x)

using namespace std;


int main()
{
        int d;
        // 设置随机数种子
        srand((unsigned int)time(NULL));
        for (int x = 0;x < 5; x++) {
           printf("此次随机数为:%d\n", random(10) + 1);

        }

        return 0;
}

编译指令:

gcc random.cpp

运行指令:

./a.out

补充拓展:

如果想产生[i,j]之间的随机数,使用以下方法:

rand() % (j - i + 1) + i

如果想产生[i,j)之间的随机数,可以使用以下方法:

rand() % (j - i) + i

要产生(i,j]之间的随机数,有如下的方法:

rand() % (j - i) + i + 1

 

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 【整理】C、C++随机数生成方法

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: