zoukankan      html  css  js  c++  java
  • 在main中调用srand是否影响子函数中的rand()的返回值?

    答案是yes

    srand改变了全局变量,所以在任何地方调用一次都会影响后续的rand返回值

    C标准给了一个sample implementation,如下(http://stackoverflow.com/questions/4768180/rand-implementation

    http://stackoverflow.com/questions/7343833/srand-why-call-only-once

    static unsigned long int next = 1;
    
    int rand(void) // RAND_MAX assumed to be 32767
    {
        next = next * 1103515245 + 12345;
        return (unsigned int)(next/65536) % 32768;
    }
    
    void srand(unsigned int seed)
    {
        next = seed;
    }

    由这个代码应该可以比较清楚地看到:next是个全局变量,每次调用srand都会修改next,而每次调用rand都要首先读取这个值,并且修改这个值。也就是说,srand对next的修改——对rand来说——是可见的

     一个小测试:

    #include <stdio.h>
    #include <stdlib.h>
    
    void print_rand()
    {
        for (int i = 0; i < 5; i++) {
            printf("%d,", rand());
        }
        printf("\n");
    }
    
    int main(int argc, const char *argv[])
    {
        srand(123);
        for (int i = 0; i < 5; i++) {
            printf("%d,", rand());
        }
        srand(123);//观察注释后的结果,对比
        print_rand();
        return 0;
    }

    注释前结果:440,19053,23075,13104,32363,440,19053,23075,13104,32363,

    注释后结果:440,19053,23075,13104,32363,3265,30749,32678,9760,28064,

    测试也验证了我们的推断

  • 相关阅读:
    8月10日
    8月9日
    8月8日
    8月7日
    8月6日
    8月5日
    《大道至简》读后感
    8月4日
    8月3日
    8月2日
  • 原文地址:https://www.cnblogs.com/fstang/p/3072856.html
Copyright © 2011-2022 走看看