关于srand()和rand()产生随机数的一点问题

今天在写程序的时候,需要产生一系列的随机数,于是我写了与下面类似的代码:
 for(int i = 0; i < 100; i++){
        srand(time(NULL));
        cout << rand()%1000 << endl;
    }

运行以后发现,产生的随机数都是相同的:


真是百思不得其解。幸好有google+baidu+sogou.

原来,在c/c++中采用srand()和rand()产生的随机数其实严格意义上来说应该叫做伪随机数。伪随机数并不是说这些数不是随机的,而是指这些数具有一定的规律。假如每次通过srand()种下的种子都是同样的,那每次产生的随机数列也应该是一样的。所以我们应该把种子设为一个变化的数,比如说流逝的时间,可以这样:srand(time(NULL))。如此一来,随着程序对种子进行赋值的时间的不同,种子time(NULL)自然也就不同了。不过,由于我是在一个for循环中对种子进行赋值的。而for循环每循环一次的时间是非常短的,远远低于一秒(注:time()返回的是秒数),也就是说for循环循环一次的时间不足以使time(NULL)发生改变。既然srand()的种子是相同的,那么rand()产生的随机数序列也就是相同的了。而每次我们输出的都是这些序列中的第一个数,所以肯定就是相同的了。验证程序:
int flag = 0;
    for(int i=0;;i++){
         srand((unsigned int)time(NULL));
        int j = rand()%1000;
        if(j != flag)
        {
            flag = j;
            cout<<i<<"      "<<j<<endl;
        }
结果:


结果说明,for循环要循环10的7次方次,才会产生不同的随机数。这应该耗费的是1秒钟吧。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值