关于rand()函数srand()函数的使用(转)
转载
关于rand()函数srand()函数的使用
早上上机实验,老师当场布置一个实验。大块的兴趣没有,只记得有一个有意思的任务,产生8*8个100以内的随机数。一看我就happy了。直接rand()0上去了,运行的时候是很开心因为产生的数看起来是随机的。实验多次之后发现了,每次产生了许多的随机数是一样样的,这样难道就随机了?
于是下课后,饭也不吃,打开电脑,查阅资料。(发现自己神经病~)
好吧先解释下原因:rand()函数产生的是伪随机数。需要srand()函数来提供种子seed来能变成真正的随机数。哦,顺便说一句这两个函数的头文件是放在#include "stdlib.h"的。
以上是碰到问题的第一步。
问题一:产生的随机数不含100?
这问题纠结了,试验多次均为发现100。说明程序很大一部分存在bug。
源代码:(VS2010强大的编程工具下)
#include "stdafx.h"
#include "stdlib.h"
#include "time.h"//这个不能丢
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned)time(NULL));//srand()在循环体外
int i,obj;
for(i=0;i<8*8;i++)
{obj=rand()0;
printf("%d ",obj);
}
system("Pause");
return 0;
}
产生的结果没有含有一百。
后来查看才知道,符合条件的代码应该是:obj=1+(int)(100.0*rand()/(RAND_MAX+1.0));
其中:
#define RAND_MAX 0x7FFF
其值最小为32767,最大为2147483647
因为产生是100以内的随机数就是100.0*若是产生n以内就用n的double形式乘以。
问题二:把srand()放在循环体内有意思的事情又发生了:代码如下:
// radom.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "stdlib.h"
#include "time.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i,obj;
for(i=0;i<8*8;i++)
{
srand((unsigned)time(NULL));//在循环体内
obj=1+(int)(100.0*rand()/(RAND_MAX+1.0));printf("%d ",obj);
}
system("Pause");
return 0;
}
情况变成所有的值都一样了。真是无比纠结。
srand()函数调用的是时间函数。每次都查看系统时间,由于执行的时间很短系统把它看成是同一时间,所以读取出来的数据是一样的。
而产生随机数只要看一次系统时间就好了。
问题解决。正确的代码:
// radom.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "stdlib.h"
#include "time.h"
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned)time(NULL));
int i,obj;
for(i=0;i<8*8;i++)
{
obj=1+(int)(100.0*rand()/(RAND_MAX+1.0));printf("%d ",obj);
}
system("Pause");
return 0;
}
基础很漂浮才导致这种结果,暂不截图鸟~~
为毛我的rand() %