C++用rand()和srand()生成随机数
内容来自《编程实战宝典》
首先来看函数原型
int rand(void); void srand(unsigned int seed);
1、rand()函数不需要任何参数,直接返回一个随机数,注意,这个随机数是有范围的,在0~RAND_MAX之间,RAND_MAX一般最小取值为32767,其具体值在头文件stdlib.h中进行定义
2、srand需要一个无符号整形数作为参数(种子),如果作为种子的无符号数相同,那么获取的随机数也就相同,注意:srand()必须配合rand()使用才能有效果
下面是用法
#include <iostream> using namespace std; int main() { int i; cout << "测试rand()函数" << endl; cout << "随机数最大值RAND_MAX为:" << RAND_MAX << endl; for (i = 0; i < 3;i++) { cout << "num = " << rand() << endl; } cout << "测试srand()函数" << endl; cout << "使用不同的种子生成随机数" << endl; for (i = 0; i < 3;i++) { srand(i); cout << "num = " << rand() << endl; } cout << "使用相同的种子生成随机数" << endl; for (i = 0; i < 3;i++) { srand(2); cout << "num = " << rand() << endl; } }
以下是结果
可以看出,在使用srand()函数时,如果使用相同的种子,那么最终用rand()函数所生成的随机数也相同
特定随机数的生成
为了使rand()函数生成的随机数在一定的范围内,可以使用如下表达式
a + rand() % n
使用上述表达式生成的随机数的范围在a ~ (a + n)之间,其中a为生成的随机数的最小值,a + n - 1为最大值。
例子如下
#include <iostream> using namespace std;
int main() { cout << "生成特定范围内的随机数:" << endl; cout << "生成5 到 15 之间的随机数" << endl; for (int i = 0; i < 5;i++) { cout << "num = " << 5 + rand() % 10 << endl; //可生成5,6,7,...,14,不包含15 } }
结果如下
使用系统时间作为种子生成随机数
为了让随机数更像随机数,降低人为因数的干扰,可以使用系统当前时间作为种子产生随机数
#include <iostream> #include <time.h> //时间函数time()的头文件 #include <windows.h> //暂停函数Sleep()的头文件 using namespace std; int main() { cout << "使用系统时间作为种子生成随机数:" << endl; for (int i = 0; i < 5;i++) { Sleep(1000); //暂停一秒,避免因程序执行过快,5次循环中系统时间未发生变化,导致产生的随机数也相同 srand((unsigned)time(NULL)); cout << "num = " << rand() << endl; } return 0; }
结果
也可以使用系统时间作为种子生成特定范围内的随机数
懒得举例了。。