user-0 提问: 关于C的随机数也随机种子

回复:
user: user-1
content: 引用 17 楼 zhao4zhong1 的回复:C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\tidtable.c 386:    ptd->_holdrand = 1L; srand Sets a random starting point.  void srand( unsigned int seed );  Routine Required Header Compatibility  srand <stdlib.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameter  seed  Seed for random-number generation  Remarks  The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.  Example  /* RAND.C: This program seeds the random-number generator  * with the time, then displays 10 random integers.  */  #include <stdlib.h> #include <stdio.h> #include <time.h>  void 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() ); }   Output      6929     8026    21987    30734    20587     6699    22034    25051     7988    10104   Floating-Point Support Routine  See Also   rand

user: user-2
content: 种子是为了获得相同的随机数序列。 比如有些科学计算当中，要随机抽样，但又要别人能重复出来。这样可以按种子抽，然后把种子公布出来，别人按种子抽就能得到一样的样本。

user: user-3
content: 引用 1 楼 lin5161678 的回复:你再次运行程序会发现输出的1000个数  和上次输出的1000个数 一模一样  那就是srand的作用 确实如此，试过的

user: user-4
content: man strand

user: user-1
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\tidtable.c 386:    ptd->_holdrand = 1L;

user: user-5
content: 随即数是随机产生的

user: user-6
content: 引用 14 楼 applegeeE 的回复:记住一点，随机数的值由上一个种子决定。当前返回的值，作为下次的种子 这样做一样不会是随机的。。

user: user-7
content: 引用 7 楼 jianhuxiaoming 的回复:明白了。。  还有一个问题。 使用两次rand会提高他的随机性吗？ 		int b=(rand()+rand())/2; 		printf("num is %d\n", b); 不会，rand()是个伪伪随机数，如果不用srand(),你每次打印出来的rand()都是固定的。

user: user-8
content: 记住一点，随机数的值由上一个种子决定。当前返回的值，作为下次的种子

user: user-9
content: 看看srand的文档

user: user-10
content: 不会。。。。

user: user-0
content: 明白了。。  还有一个问题。 使用两次rand会提高他的随机性吗？ 		int b=(rand()+rand())/2; 		printf("num is %d\n", b);

user: user-1
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-11
content: 引用 11 楼 lin5161678 的回复:b的值是 1  那么2次rand的返回值有3中可能 0 1 1 0 1 1 弄错了 b的值是1 应该对应的  1 1  1 2  2 1  惭愧

user: user-11
content: 引用 7 楼 jianhuxiaoming 的回复:明白了。。  还有一个问题。 使用两次rand会提高他的随机性吗？ 		int b=(rand()+rand())/2; 		printf("num is %d\n", b); 不会 张开点的说  b的值是 1  那么2次rand的返回值有3中可能 0 1 1 0 1 1  b的值是 rand最大值  那么 2次rand的返回值只有1中可能 最大值 最大值  本来 b的值为1 的概率 应该和 b的值为 最大值的概率 是一样的[理想状态下] 现在 最大值出现的概率只有其他数的 1/3  这情况是降低随机性

user: user-12
content: 引用 7 楼 jianhuxiaoming 的回复:明白了。。  还有一个问题。 使用两次rand会提高他的随机性吗？ 		int b=(rand()+rand())/2; 		printf("num is %d\n", b); 当然不会了。

user: user-13
content: 引用 1 楼 lin5161678 的回复:你再次运行程序会发现输出的1000个数  和上次输出的1000个数 一模一样  那就是srand的作用  一针见血

user: user-14
content: 伪随机的！。。

user: user-15
content: srand()是用来初始化随机种子数的，因为rand的内部实现是用线性同余法做的，他不是真的随机数，只不过是因为其周期特别长，所以有一定的范围里可看成是随机的，式子如下：  rand = rand*const_1 + c_var;   srand函数就是给它的第一个rand值。  不用srand函数，随机种子为1

user: user-16
content: 随机数有伪随机数 它的意思 就是 生命的轨迹是既定的 就是一次为随机 多次会重复第一次的随机  而时间为种子的话 是多次 都为随机 因为 时间的定义为从1990 几月几日(我忘了)0点 到现在经过的秒数 这个值 是永远往下走的一直在加】 直到它溢出为止  但是我感觉我们活不到那时候了