我是靠谱客的博主 微笑鸡翅,最近开发中收集的这篇文章主要介绍C语言 随机数的简单研究,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

操作系统: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语言 随机数的简单研究所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部