rand()函数在某种情况上,生成的随机数是一样的

rand()函数在某种情况下,生成的随机数是一样的?
如题,看下面代码:
C/C++ code

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int test_time()
{
    srand(time(NULL));
    return rand()%10000;
}

int main()
{
    printf("%d\n", test_time());
    printf("%d\n", test_time());
    printf("%d\n", test_time());
    return 0;
}



三次输出的是一样的。

但改成下面这样,就正常了:
C/C++ code

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int test_time()
{
    return rand()%10000;
}

int main()
{
    srand(time(NULL));
    printf("%d\n", test_time());
    printf("%d\n", test_time());
    printf("%d\n", test_time());
    return 0;
}



------解决方案--------------------
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c
C/C++ code
/***
*rand.c - random number generator
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

/***
*void srand(seed) - seed the random number generator
*
*Purpose:
*       Seeds the random number generator with the int given.  Adapted from the
*       BASIC random number generator.
*
*Entry:
*       unsigned seed - seed to seed rand # generator with
*
*Exit:
*       None.
*
*Exceptions:
*
*******************************************************************************/

void __cdecl srand (
        unsigned int seed
        )
{
        _getptd()->_holdrand = (unsigned long)seed;
}


/***
*int rand() - returns a random number
*
*Purpose:
*       returns a pseudo-random number 0 through 32767.
*
*Entry:
*       None.
*
*Exit:
*       Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/

int __cdecl rand (
        void
        )
{
        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
}

------解决方案--------------------
随机数在某些场合(例如游戏程序)是非常有用的,但是用计算机生成完全随机的数却不是那么容易。计算机执行每一条指令的结果都是确定的,没有一条指令产生的是随机数,调用C标准库得到的随机数其实是伪随机(Pseudorandom)数,是用数学公式算出来的确定的数,只不过这些数看起来很随机,并且从统计意义上也很接近均匀分布(Uniform Distribution)的随机数。

C标准库中生成伪随机数的是rand函数,使用这个函数需要包含头文件stdlib.h,它没有参数,返回值是一个介于0和RAND_MAX之间的接近均匀分布的整数。RAND_MAX是该头文件中定义的一个常量,在不同的平台上有不同的取值,但可以肯定它是一个非常大的整数。通常我们用到的随机数是限定在某个范围之中的,例如0~9,而不是0~RAND_MAX,我们可以用%运算符将rand函数的返回值处理一下:

int x = rand() % 10;

------解决方案--------------------
它这个随机其实是一个随机序列,就是说当调用rand的时候值早已经确定好了,通过srand可以重置随机序列。