zoukankan      html  css  js  c++  java
  • rand(),srand()区别

    先从随机数的原理谈起.
    
    计算机的随机数都是由伪随机数,即是由小M多项式序列生成.产生每个小序列都有一个初始值,即随机种子.
    
    srand()产生随机种子.
    
    rand()产生随机数
    
    要保证计算机产生不相同的随机数,应保证它们的随机种子是不一样的.
    
    srand( (unsigned)time( NULL ) );
    
    就是以时间做为随机种子,因为每次你运行的时间总是不一样的.
    
    补充一点是小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,即你取得65535个随机数后它们又重复出现了.
    
    使用时要加头文件:
    
    #include<string.h>
    
    int nRand;
    
    srand( (unsigned)time( NULL ) );
    
    for(int i=0;i<65538;i++)
    
    {
    
    nRand=rand();
    
    if(i==1||i==65536)
    
    printf("%d
    ",nRand);
    
    }
    
    1,先看一个例子
    #include <iostream>
    
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    int main( void )
    {
        int i;
       
        srand( (unsigned)time( NULL ) );
       
        for( i = 0; i < 10;i++ )
        printf( " %6d
    ", rand() );
    }
    
    2.关于time.h
        time.h中包含很多有趣的函数,譬如
        char *ctime(long *clock)
        本函数把clock所指的时间(如由函数time返回的时间)转换成下列格式的
        字符串:Mon Nov 21 11:31:54 1983
    
    
    #include<iostream>
    #include<stdlib.h>
    #include<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 "<<<'
    ';
        }
    }
    
    查看ptstring的值会显示 "Tue Sep 13 16:31:06 2005"
    
    3, 最后说说srand()函数
        void srand(unsigned seed) 初始化随机数发生器
    
        有讨论如下:
        1.C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进rand函数的实现中,我觉得至少有三个原因:
        (1)可以高效产生连续的随机数,不用每次都初始化;
        (2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据做种子,而不是系统时钟;
        (3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。 
    
        事实上有一个更重要的原因: 
        作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-:产生的序列必须是可重现的。 
        这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一次测试的过程,从而更有效的找到问题的所在。 
        所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么,必须保证你的rand()调用是可重现的。
    
    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之间的随机数
    
    5.总结
    1)srand()给rand()提供种子
    2)srand()中的seed一般由时间函数得,eg  srand((UINT)GetCurrentTime())  srand( (unsigned)time( NULL ) ) time()函数得到现在的系统时间...等等
    
  • 相关阅读:
    HDU5446 Unknown Treasure
    C语言课设——通讯录操作系统
    判断设备是否横屏
    禁止用户横屏
    用javascript编写ps脚本
    用户鼠标指针的样式
    如何使用typescript开发node(自动编译,自动重启)
    CSS3:box-sizing:不再为匣子模型而烦恼
    命令行开启自动编译scss(webstrom可开启自动编译)
    TypeError: Cannot read property 'replace' of undefined ----angular2
  • 原文地址:https://www.cnblogs.com/flying-tx/p/3793075.html
Copyright © 2011-2022 走看看