C、C++中我们可能会有这种需求,生成一些随机数供使用。
首先我们来看下演示效果:
生成1~10的随机数:
下面开讲:
在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一样),那么你总是会得到相同的“随机”数字。
如果我们想生成每次都不一样的数字,那么我们需要设置随机种子。设置随机种子通过函数: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
文章的脚注信息由WordPress的wp-posturl插件自动生成