user-0 提问: 请教rand（）函数遇到的小问题

回复:
user: user-1
content: C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\RAND.C /*** *rand.c - random number generator * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  #ifndef _MT static long holdrand = 1L; #endif  /* _MT */  /*** *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         ) { #ifdef _MT          _getptd()->_holdrand = (unsigned long)seed;  #else  /* _MT */         holdrand = (long)seed; #endif  /* _MT */ }   /*** *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         ) { #ifdef _MT          _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff );  #else  /* _MT */         return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); #endif  /* _MT */ }

user: user-2
content: 引用 4 楼 u013163178 的回复:[quote=引用 2 楼 modyaj 的回复:] 随机数种子只设置一次  剩下的就系统自己处理  第二个程序 和第一个比起来 没什么实质的改变   同样的是每个随机数之前都设置了一次种子   你在第一个程序中 每次生成随机数后看看 sleep（1000）看看 结果会不会相同 第二个只是设置了一次啊，还能怎么改啊，难道到了把srand()放在mian()函数里面吗[/quote]  for循环里每次调用 RandomFloate  都会设置一次的  解释上面的说得已经很清楚了   我觉得够了

user: user-3
content: 马克，学习一下，积分快不够提问题列。。。。

user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\RAND.C /*** *rand.c - random number generator * *       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  #ifndef _MT static long holdrand = 1L; #endif  /* _MT */  /*** *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         ) { #ifdef _MT          _getptd()->_holdrand = (unsigned long)seed;  #else  /* _MT */         holdrand = (long)seed; #endif  /* _MT */ }   /*** *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         ) { #ifdef _MT          _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff );  #else  /* _MT */         return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); #endif  /* _MT */ }  第一次看你的这个代码，不知道啥意思，后来谁午觉是突然得到了启发，哈哈，谢谢诶 我已经搞定了 #include<stdio.h> #include<stdlib.h> #include<time.h>  /*随机获取[M , N]区间内的浮点数 */ int  j =0; double RandomFloate(int M, int N) {  /***************************************************/ 	if(j ==0)   //确保仅设置seed一次                	{ 	 		time_t t; 		srand((unsigned)time(&t)); 	} 	j = 1; /****************************************************/   	int RandomValue1; 	double RandomValue2;  	RandomValue1 = M + (int)(rand() % (M - N + 1)); 	RandomValue2 = rand() / (double)(RAND_MAX + 1); 	return RandomValue1 + RandomValue2; } /***************************************************/  int main() { 	int i;     for(i= 0;i<1000; i++)         {            printf("%f\t",RandomFloate(29,518));          } 	return 0; }

user: user-0
content: 引用 11 楼 modyaj 的回复:[quote=引用 4 楼 u013163178 的回复:] [quote=引用 2 楼 modyaj 的回复:] 随机数种子只设置一次  剩下的就系统自己处理  第二个程序 和第一个比起来 没什么实质的改变   同样的是每个随机数之前都设置了一次种子   你在第一个程序中 每次生成随机数后看看 sleep（1000）看看 结果会不会相同 第二个只是设置了一次啊，还能怎么改啊，难道到了把srand()放在mian()函数里面吗[/quote]  for循环里每次调用 RandomFloate  都会设置一次的  解释上面的说得已经很清楚了   我觉得够了[/quote] 非常感谢你的热心回答，我知道了怎么办了

user: user-4
content: 虽然没研究过，平时只是用，但是看完楼上的这些回复，对这个函数有一定了解了

user: user-5
content: 计算机里面是没有真正的随机数的，这些库产生都是伪随机数列，同一个种子值进去，产生是一串相同的数列，数列中数的分布情况是衡量这个随机数函数好坏的主要标准

user: user-6
content: 引用 3 楼 u013163178 的回复:[quote=引用 1 楼 czarten 的回复:] 随机数种子在一开始设定一次就可以 不是每次取随机数前都设一次种子 只设置一次的话，下次的种子岂不是和上一次一样的，那么随机值岂不是一样了[/quote] rand内部会更新随机种子的 正如czarten所说，每次都重新设置种子的话，由于时间间隔太近，【电脑循环计算速度太快了导致】得到相同的种子，也就对应相同的随机数队列

user: user-7
content: 你要看time返回的是不是同一个值

user: user-8
content: 引用 3 楼 u013163178 的回复:[quote=引用 1 楼 czarten 的回复:] 随机数种子在一开始设定一次就可以 不是每次取随机数前都设一次种子 只设置一次的话，下次的种子岂不是和上一次一样的，那么随机值岂不是一样了[/quote]  随机数种子并不是确定一个随机数，而是确定一个随机数队列 所以你设好一个种子，就有了一整列的随机数等着你来取，你一个一个往下取就是了 反而你每次都重新设置种子的话，由于时间间隔太近，得到相同的种子，也就对应相同的随机数队列，这样你每次取随机数都取的是这个队列的第一个数，结果当然就是相同的了

user: user-0
content: 引用 2 楼 modyaj 的回复:随机数种子只设置一次  剩下的就系统自己处理  第二个程序 和第一个比起来 没什么实质的改变   同样的是每个随机数之前都设置了一次种子   你在第一个程序中 每次生成随机数后看看 sleep（1000）看看 结果会不会相同 第二个只是设置了一次啊，还能怎么改啊，难道到了把srand()放在mian()函数里面吗

user: user-0
content: 引用 1 楼 czarten 的回复:随机数种子在一开始设定一次就可以 不是每次取随机数前都设一次种子 只设置一次的话，下次的种子岂不是和上一次一样的，那么随机值岂不是一样了

user: user-2
content: 随机数种子只设置一次  剩下的就系统自己处理  第二个程序 和第一个比起来 没什么实质的改变   同样的是每个随机数之前都设置了一次种子   你在第一个程序中 每次生成随机数后看看 sleep（1000）看看 结果会不会相同

user: user-8
content: 随机数种子在一开始设定一次就可以 不是每次取随机数前都设一次种子