C++提供rand()
用于生成范围内的随机数,它两都位于头文件cstdlib
中(其实真实位置是stdlib.h
文件中),RAND_MAX
的取值会有所差异,一般它的值会与INT_MAX
保持一致。
rand()
内部是用线性同余法实现的,所以并不是真正的随机数。比如下面这段代码:
#include <iostream> #include <cstdlib> int main() { std::cout << rand() << std::endl; return 0; }
上面这段代码在编译后,在同一台机器上,每次运行的结果固定是同一个值。可以理解成:随机一次,之后每次运行程序,它返回的值就确定了。
那如何才能让每次运行返回的结果都不一样呢?这就需要用到srand()
了。srand()
用于初始化随机数发生器,它接收一个unsigned int
型的参数种子。一般,srand()
传入time(0)
,来确保每次输入的种子不同。
#include <iostream> #include <cstdlib> int main() { srand(time(0)); std::cout << rand() << std::endl; return 0; }
编译运行程序,这时候每次运行程序,rand()
返回的结果就不一样了,“随机”了。
rand()
用到的算法中是通过种子来计算生成随机数的,其实最开始的那段代码中,虽然我们没有显式设置种子,但实际上这时候默认种子为0。每次传入的种子一样,那么此次程序运行调用rand()
生成的随机数序列也一样。
#include <iostream> #include <cstdlib> int main() { srand(0); std::cout << rand() << std::endl; return 0; }
编译运行,这时候可以看到程序每次运行的结果又是相同的了。
有没有注意到,它的结果和第一张图中的是一致的?(因为我是在同一台机器上测试的)
总结一下,如果我们要在程序中使用随机数,该怎么做呢?
1、一定要调用srand()
设置种子,一般,传入的值是当前机器的时间time(0)
,且在一个程序中只要设置一次即可。
2、好像没看见其他接口,如何获取指定范围内的随机数?rand()
返回的是范围内的随机数,比如我们需要获取以内的随机数,只需要用rand() % 100
即可。