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

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()生成一个值作为种子。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值