卡尔威特的教育全书:c语言中如何随机生成数

来源:百度文库 编辑:中财网 时间:2024/04/28 20:18:36

srand()就是给rand()提供种子seed

直接看最后的总结

如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的,

srand(n)

for(10)

rand()
也就是说,以一个固定的数值作为种子是一个缺点。 通常的做法是  以这样一句代码srand((unsigned) time(NULL));来取代,这样将使得种子为一个不固定的数, 这样产生的随机数就不会每次执行都一样了。


1,先看一个例子 
#include  
#include  //调用srand()和rand()
#include  //要调用time()函数
using namespace std; 
int 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() ); 
}

2.关于time.h 
time.h中包含很多有趣的函数,譬如 
char *ctime(long *clock) 
本函数把clock所指的时间(如由函数time返回的时间)转换成下列格式的 
字符串:Mon Nov 21 11:31:54 1983/n/0

#i nclude  
#i nclude  
#i nclude  
using namespace std;


void main() 

time_t t1,t2; 
char getTime[20]; 
char *ptstring=getTime;

int x,count=0; 
x=RAND_MAX; 
cout<<<'/n'; 
t1=time(NULL); 
ptstring=ctime(&t1);

while(count<=100) 

srand( (unsigned)time( NULL ) ); 
x=rand()%50; 
if(x<5) 
continue; 
else 

count++; 
cout<<"the numth is "<<<'/n'; 

}

查看ptstring的值会显示 "Tue Sep 13 16:31:06 2005"

3, 最后说说srand()函数 
void srand(unsigned seed) 初始化随机数发生器

有讨论如下: 
1.C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进ran

d函数的实现中,我觉得至少有三个原因: 
(1)可以高效产生连续的随机数,不用每次都初始化; 
(2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据

做种子,而不是系统时钟; 
(3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不

了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。

事实上有一个更重要的原因: 
作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-》产生的序

列必须是可重现的。 
这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中

使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一

次测试的过程,从而更有效的找到问题的所在。 
所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么

,必须保证你的rand()调用是可重现的。

4,c语言里函数rand()和srand()的用法 - -

rand(void)用于产生一个伪随机unsigned int 整数。 
srand(seed)用于给rand()函数设定种子。

srand 和 rand 应该组和使用。一般来说,srand 是对 rand 进行设置。 
比如: 
srand((UINT)GetCurrentTime()); 
int x = rand() % 100; 
是生成 0 到 100 之间的随机数。

srand()是用来初始化随机种子数的,因为rand的内部实现是用线性同余法做的,他不是真

的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,式子如下

: 
rand = rand*const_1 + c_var; 
srand函数就是给它的第一个rand值。

用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的, 
比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))   产生一个0到n之间的随机


RAND_MAX=0x7fffffff

5.总结 

1)srand()给rand()提供种子 
2)srand()中的seed一般由时间函数得,eg srand( (unsigned)time( NULL ) ) time()函数得到现在的系统时间...等等

3)如srand()函数中的参数图一样,则rand()产生的随机数也一样,所以一般srand()中的参数一般有时间函数time(0)获得

4)time函数的返回值是从格林尼治标准时间1970年1月1日0时起到现在的秒数,所以每次调用该函数的返回值都不一样

计算器如何随机生成数?? 请问C语言中如何产生随机两位数 如何在C语言中实现随机选号? VC++中如何生成随机序列 C语言中怎么实现随机取数啊? C语言中如何求任意两数的余数 在C语言中怎样随机取数,为什么有random函数每次取数都是一样,望高手赐教,谢谢! c语言如何生成dat 文件 请问在51单片机中,如何通过C语言将浮点数转变为字符串呢? 如何在VC中创建不是基于MFC的EXcel表格的生成阿?用C语言的阿 在Excel中如何生成自动合计数 c语言的随机生成函数应该怎么用?怎么才能让它同时生成好几个随机数?并把它存放在一个数组里? c语言中如何判断一数是否在一已知数组中?有没有这样的函数 c语言中各种数据类型所占的字节数? C语言中,怎么比较三个数的大小?? 如何在VB中自动生成一个文件并且随机命名文件(路径固定,名字不固定)?例如,随机生成"D:\VB\123***.TXT" 如何随机生成 6 位 16进制数? 求一段c语言代码,从1到33里随机取六个数加起来的和 在C语言中,何为主调函数和被调函数,他们之间有何必要联系,如何从程序中判断哪里是主调,哪里是被调 如何用C语言产生随机序列 c语言里的随机函数 C语言中的随机函数问题 c语言中如何编程序:判断一个数n能同时被3和5整除 如何在VB中生成随机数,用Rnd生成的数,每次运行时得到数都一样。