Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 205|回复: 0

[默认分类] srand()以及rand()函数用法(zz)

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-9 14:46:52 | 显示全部楼层 |阅读模式

       
    srand()就是给rand()提供种子seed  
      如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的,

    srand(n)
    for(10)
    rand()
    也就是说,以一个固定的数值作为种子是一个缺点。 通常的做法是  以这样一句代码srand((unsigned) time(NULL));来取代,这样将使得种子为一个不固定的数, 这样产生的随机数就不会每次执行都一样了。

    1,先看一个例子
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    int main( void )
    {
    int i;
    /* Seed the random-number generator with current time so that
    * the numbers will be different every time we run.
    */
    srand( (unsigned)time( NULL ) );
    /* Display 10 numbers. */
    for( i = 0; i < 10;i++ )
    printf( " %6d/n", rand() );
    }  
    2.关于time.h
    time.h中包含很多有趣的函数,譬如
    char *ctime(long *clock)
    本函数把clock所指的时间(如由函数time返回的时间)转换成下列格式的
    字符串:Mon Nov 21 11:31:54 1983/n/0  
    #i nclude <iostream>
    #i nclude <stdlib.h>
    #i nclude <time.h>
    using namespace std;  

    void main()
    {
    time_t t1,t2;
    char getTime[20];
    char *ptstring=getTime;  
      int x,count=0;
    x=RAND_MAX;
    cout<<<"/n";
    t1=time(NULL);
    ptstring=ctime(&t1);  
    while(count<=100)
    {
    srand( (unsigned)time( NULL ) );
    x=rand()%50;
    if(x<5)
    continue;
    else
    {
    count++;
    cout<<"the numth is "<<<"/n";
    }
    }  
    查看ptstring的值会显示 "Tue Sep 13 16:31:06 2005"  
    3, 最后说说srand()函数
    void srand(unsigned seed) 初始化随机数发生器  
      有讨论如下:
    1.C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进ran

    d函数的实现中,我觉得至少有三个原因:
    (1)可以高效产生连续的随机数,不用每次都初始化;
    (2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据

    做种子,而不是系统时钟;
    (3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不

    了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。  
      事实上有一个更重要的原因:
    作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-》产生的序

    列必须是可重现的。
    这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中

    使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一

    次测试的过程,从而更有效的找到问题的所在。
    所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么

    ,必须保证你的rand()调用是可重现的。  
    4,c语言里函数rand()和srand()的用法 - -  
    rand(void)用于产生一个伪随机unsigned int 整数。
    srand(seed)用于给rand()函数设定种子。  
    srand 和 rand 应该组和使用。一般来说,srand 是对 rand 进行设置。
    比如:
    srand((UINT)GetCurrentTime());
    int x = rand() % 100;
    是生成 0 到 100 之间的随机数。  
    srand()是用来初始化随机种子数的,因为rand的内部实现是用线性同余法做的,他不是真

    的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,式子如下


    rand = rand*const_1 + c_var;
    srand函数就是给它的第一个rand值。  
    用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,
    比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))   产生一个0到n之间的随机


    RAND_MAX=0x7fffffff  
    5.总结
    1)srand()给rand()提供种子
    2)srand()中的seed一般由时间函数得,eg srand((UINT)GetCurrentTime()) srand( (u

    nsigned)time( NULL ) ) time()函数得到现在的系统时间...等等
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 21:21 , Processed in 0.374116 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表