随机数的产生——srand(time(0))的误用

    xiaoxiao2023-10-27  164

    rand()

    C语言中可以只用rand()函数来产生0~RAND_MAX之间的随机数,其中RAND_MAX的值与平台有关,至少为32767,这个函数包含在stdlib.h中。

    srand()

    有时候便于测试,我们需要每次重新运行程序,都产生相同的随机数,C语言提供了srand()函数来对随机数生成器进行初始化,也叫做为随机数生成器设置种子,在设置相同的种子之后,调用rand()来生成的随机数序列都是相同的。如果不进行设置,默认随机数种子为0,所以每次重新运行程序,都会产生相同的随机数序列。 所以C语言生成的随机数也称为伪随机数。

    srand(time(0))以当前时间为种子

    time是C语言获取当前系统时间的函数,以秒作单位,time(0)返回当前时间自Unix标准时间戳(1970年1月1日0点0分0秒,GMT)经过了多少秒。 如果要是每次运行时产生的随机数不同,可以以当前时间time(0)作为随机数种子,这样每一次重新设置种子之后,产生的随机数序列就不同了。

    srand(time(0))的误用

    但是,因为time(0)返回值是以秒为单位,如果在要在一秒内产生多个随机数序列,以time(0)做种子也不行,如下例子,两次产生的随机数序列是一样的,因为执行太快了,两次随机数序列都是在同一秒内产生完了,测试代码如下:

    #include <iostream> #include <stdlib.h> #include <time.h> #include <Windows.h> int main() { srand(time(0)); std::cout<<"first sequence:"<<std::endl; for (int i=0;i<5;i++) { std::cout << rand() << std::endl; } srand(time(0)); std::cout<<"second sequence:"<<std::endl; for (int i=0;i<5;i++) { std::cout << rand() << std::endl; } return 0; } //一种输出 first sequence: 15897 4404 12877 17526 8080 second sequence: 15897 4404 12877 17526 8080

    这种情况下,可以不设置种子,或者先用rand()生成一个值作为种子。

    最新回复(0)