陈默 2009年09月04日 星期五 10:23 | 1903次浏览 | 2条评论
真随机数是
真随机数是真正随机的数,而计算机模拟使用的是伪随机数,是按某种算法计算产生的,是一个固定的序列。计算机的重要用途之一就是利用随机数函数生成随机数,对随机现象进行定量的描述、模拟和研究。
产生随机数最快、统计性能最好的乘法同余法:
R'=C*R(Mod M)
C为常数,R为第n个随机数,R'为第n+1个随机数,M为模,Mod为取余
当R0相对于M是素数、C是M的原始方根时,生成的随机数恰恰是一个周期。
推荐采用的值是C=262147(素数)、R0=34359738365、M=549755813888
通常是R'/M转换为0和1之间的随机小数
从实际应用触发,我们定义随机数函数double rnd(int x)
x=0,重复上一个随机数
x=1,得到一个新的随机数
x=-1,第一次使用随机数,从r0开始,利用时钟先产生几万个随机数,舍去,目的是使随机数趋于稳定,并自动建立磁盘文件rndfile储存一个8字节的随机小数
x=-2,从文件中读入上一次存储的随机数,开始新随机数的计算
x=-3,将产生的最后一个随机数,存入rndfile
可以写成rndlib.h,方便以后使用,如果这样的话,应该去掉exit(0);的注释~~~~
#include <stdio.h>
#include "math.h"
#include "time.h"
#include "stdlib.h"
double rnd(int x)
{
FILE *fp;
time_t t1; //time_t是与时间有关的类型,可用长整型表示时间
static double c=262147.0,t,i,r=34359738365.0/549755813888.0;
if(x==1) r=r*c-(long)(r*c); //产生随机小数
else if(x==0); //空语句,使函数返回原r值
else if(x==-1) //第一次使用随机数函数
{
if((fp=fopen("rndfile","wb"))==NULL) //wb以只写方式建立并打开一个二进制文件,若文件已存在,则打开时清除原内容
{
printf("1 cannot open this file \n");
//~ exit(0); //The exit() function causes normal process termination and the value of status & 0377 is returned to the parent
}
t=time(&t1) % 90000 +10000; //time()返回系统的当前日历时间
for(i=1;i<=t;i++) //产生t个随机数不用
r=r*c-(long)(r*c);
fwrite(&r,8,1,fp); //将随机数存入文件
}
else
{
if((fp=fopen("rndfile","rb+"))==NULL) //rb+以读/写方式打开一个二进制文件,此文件必须存在
{
printf("2 cannot open this file \n");
//~ exit(0);
}
if(x==-2) fread(&r,8,1,fp);
else
{
rewind(fp);fwrite(&r,8,1,fp);fclose(fp);//The rewind() function sets the file position indicator for the stream pointed to by stream to the beginning of the file.
}
}
return(r);
}
Zeuux © 2024
京ICP备05028076号
回复 小包 2009年09月04日 星期五 19:31
回复 陈默 2009年09月04日 星期五 19:42
Li