用C语言模拟随机数的生成

 

函数实现出处:http://baike.baidu.com/view/876758.htm

ftime讲解出处:百度百科 ftime

函数定义:int ftime(struct timeb *tp);

函数说明:ftime()将目前日期由tp所指的结构返回。
tp结构定义:
struct timeb{
  time_t time; /* 为1970-01-01至今的秒数*/
  unsigned short millitm; /* 千分之一秒即毫秒 */
  short timezonel; /* 为目前时区和Greenwich相差的时间,单位为分钟 */
  short dstflag; /* 为日光节约时间的修正状态,如果为非0代表启用日光节约时间修正 */
  };
   返回值 :无论成功或失败都返回0

 

 

在函数里,我增加了一些注释,希望大家能看得懂 。

有些人可能会觉得为什么不直接用Initial()函数的返回值就好了,这是因为Initial()函数里是通过 timeb作为种子,因为 timeb 是返回现在与1970.1.1午夜后的时间差,单位是毫秒,而计算机的执行速度很快,执行我们的这个小程序甚至不需要一毫秒,所以给出的数值都会很接近,甚至相同。

该程序的实现也是一个伪随机数。

事实上,在查找资料时,还发现有有另外一种实现方法,该方法较安全,且随机性较大,但较为复杂。有兴趣的可以看一下这个帖子:http://bbs.csdn.net/topics/80515171

 

#include<stdio.h>
#include<sys/timeb.h>
#include<time.h>
#include<stdlib.h>

//用于返回随机数初值
double Initial()
{
	double init;
	struct timeb tp;
	while(true)
	{
		ftime(&tp);
		 init=tp.millitm*0.9876543*0.001;
		//tp.millitm的取值范围是	0-999
		//因此这边init的取值应该是	[0,0.987654321)
		if(init>=0.001)
		{
			break;
		}
	}
		return init;
}

//返回一个(0 , 1)随机数
double Random()
{
	static double rndm=-1.0;
	if(rndm==-1.0)
		rndm=Initial();
	else
		rndm=3.99*rndm*(1.0-rndm);
	//  0<(rndm*(1-radm))<=0.25 可以用二次函数证明

	return rndm;
}

int main()
{
	/* 系统自带生成,产生[0,4]随机数*/
	/*
	srand((int)time(0));
	for(int i=0;i<5;i++)
	{
		printf("%d  ",rand()%5);
	}*/
	int t=0;
	while(t++<10)
		printf("%lf     %lf\n", Random(), Initial());
	getchar();
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值