概述
操作系统:Windows 10
IDE:Visual C++ 6.0
先来看一段代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
void main(void)
{
int i;
for(i=0;i<100;++i)
{
//srand(time(NULL));
printf("%dt",rand()%100000);
Sleep(100);
}
}
运行结果:
再次运行,你会发现结果也是一样的。
这种随机数用专业术语来说叫做伪随机数。
常见的解决方案是通过添加srand()函数,以时间time(NULL)作为种子来使生成的随机数更趋近了随机
测试代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
void main(void)
{
int i;
for(i=0;i<100;++i)
{
srand(time(NULL));
printf("%dt",rand()%100000);
Sleep(100); //暂停100毫秒
}
}
每次运行结果都是不一样了,但是会出现连续的多个重复值,并且两个不同的值之间相差不大,这是什么原因呢?想想就知道是种子出了问题,打印下看看
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
void main(void)
{
int i;
for(i=0;i<100;++i)
{
int seed;
seed = time(NULL);
srand(seed);
printf("num:%d,seed is:%dn",rand()%100000,seed);
Sleep(100); //暂停100毫秒
}
}
执行结果:
由图可知,种子一样时生成的随机数也是一样的,并且是每连续9个数是一样的!为什么呢?这是代码中的Sleep(100)起的作用,并且执行需要时间,所以1秒内能执行9次。因此可知,time(NULL)是每秒产生一个数的。经过查阅资料可知,time(NULL)返回的值是从1970年1月1日0时0分0秒到当前时间的秒数,也很好的说明了为什么生成随机数时为什么有大量连续重复的值,并且随机数的值很接近的问题了。
既然time(NULL)并不是良方,那还有什么办法能产生更好的随机数呢?
肯定是有的!!既然以秒为单位的种子不可以,毫秒不就可以了?可以试试clock()函数,该函数是记录程序运行时长的毫秒数
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
void main(void)
{
int i;
for(i=0;i<100;++i)
{
int seed;
seed = clock();
srand(seed);
printf("num:%d,seed is:%dn",rand()%100000,seed);
Sleep(100); //暂停100毫秒
}
}
由于受CPU的影响,每次循环运行的时间都是不一样的,因此种子的间距也不全是一样的。但是这样的话随机数会呈现循环递增的情况。有什么解决方案呢?
肯定是有的!clock()函数平方几次不就完了?clock()*time()不是也可以?也就是说,生成的随机数范围越大,多乘于几个平方就可以了!
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
void main(void)
{
int i;
for(i=0;i<100;++i)
{
unsigned int seed;
seed = clock()*clock()*time(NULL);
srand(seed);
printf("num:%d,seed is:%un",rand()%100000,seed);
Sleep(100); //暂停100毫秒
}
}
运行结果
总结:
要使生成的随机数随机些,就要用srand()函数配合clock()函数和time(NULL)当种子使用!
如果随机数的范围比较大,把clock()和time(NULL)多乘几次就行了。办法总会有的,动脑就行!
最后
以上就是微笑鸡翅为你收集整理的C语言 随机数的简单研究的全部内容,希望文章能够帮你解决C语言 随机数的简单研究所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复