user-0 提问: 关于rand()产生随机数的一个问题

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *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++刚入门，源程序真心看不懂。。。

user: user-0
content: [quote=引用 7 楼 wang2008012315 的回复:] 个人的一种理解： srand() 是撒下随机数的种子 将收获一个随机数的矩阵，而rand()表示依次从这个矩阵中取出一个数并返回 ，就像种瓜得瓜，种豆得豆一样，如果你给srand()输入的整型参数不同，那么你获取的随机数矩阵也不同   调用rand()返回的值也就不同。 具体到该例子，srand(time(NULL))表示 以 从1970年1月1日0时0分秒到现在所经过的秒数  为种子 ，那么对应也会产生一个随机数矩阵。当连续调用rand()返回的是随机数矩阵的前两个数。楼主可以做如下实验，在一秒内运行该程序两次，会发现第一次运行产生的随机数a.b与第二次产生的随机数 a、b是相同的，而超过1，秒的话情况就不同了[/qusrandote]  刚才又做了一个实验： ...... srand(time(0)); int a=rand(); srand(time(0)); int b=rand();  a、b的值每次都是一样的，因为在同一秒内，种子一样。。。

user: user-1
content: 赵老师这，源程序都搬来了 return 这个语句产生那个随机数。

user: user-1
content: 这和时间没关系，你只初始化随机数发生器一次，所以每次调用rand()，生成一个不同的随机数。 这就是随机数发生器的机制，每次产生一个伪随机序列中的一个数字。

user: user-2
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *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 ); }

user: user-3
content: 引用 5 楼 richyhuang 的回复:srand就是设置种子,如果srand的内容一样,那么后面产生的是一样的. int rand_t() { srand(100); int a=rand(); srand(100); int b=rand(); return 0; }   正解了。

user: user-4
content: 引用 7 楼 wang2008012315 的回复:个人的一种理解： srand() 是撒下随机数的种子 将收获一个随机数的矩阵，而rand()表示依次从这个矩阵中取出一个数并返回 ，就像种瓜得瓜，种豆得豆一样，如果你给srand()输入的整型参数不同，那么你获取的随机数矩阵也不同   调用rand()返回的值也就不同。 具体到该例子，srand(time(NULL))表示 以 从1970年1月1日0时0分秒到现在所经过的秒数  为种子 ，那么对应也会产生一个随机数矩阵。当连续调用rand()返回的是随机数矩阵的前两个数。楼主可以做如下实验，在一秒内运行该程序两次，会发现第一次运行产生的随机数a.b与第二次产生的随机数 a、b是相同的，而超过1，秒的话情况就不同了  是的，我就是做过实验在一秒钟连续执行同一个rand时，产生的数一样，才会有本帖的疑问。 感谢你的回复，我想我明白怎么回事了，也谢谢其他人的回复。

user: user-5
content: 个人的一种理解： srand() 是撒下随机数的种子 将收获一个随机数的矩阵，而rand()表示依次从这个矩阵中取出一个数并返回 ，就像种瓜得瓜，种豆得豆一样，如果你给srand()输入的整型参数不同，那么你获取的随机数矩阵也不同   调用rand()返回的值也就不同。 具体到该例子，srand(time(NULL))表示 以 从1970年1月1日0时0分秒到现在所经过的秒数  为种子 ，那么对应也会产生一个随机数矩阵。当连续调用rand()返回的是随机数矩阵的前两个数。楼主可以做如下实验，在一秒内运行该程序两次，会发现第一次运行产生的随机数a.b与第二次产生的随机数 a、b是相同的，而超过1，秒的话情况就不同了

user: user-6
content: 你的“按理”都不成立

user: user-7
content: srand就是设置种子,如果srand的内容一样,那么后面产生的是一样的. int rand_t() { srand(100); int a=rand(); srand(100); int b=rand(); return 0; }

user: user-8
content: srand(time(0));并不是时间，只是随机处理，没有加这个的话，重新启动程序，rand出来的结果是一样的，不发生变化