函数实现出处: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
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;
}