您的位置:首页 > 编程语言 > C语言/C++

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

2014-06-16 20:20 225 查看
函数实现出处: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: