陈默

陈默的博客

他的个人主页  他的博客

090904随机数函数——程序算法与技巧精选 学习笔记

陈默  2009年09月04日 星期五 10:23 | 1908次浏览 | 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哲思注册吗?现在 注册 !
小包

回复 小包  2009年09月04日 星期五 19:31

伊!~~~ 又学到东西了。。 C 开发在WINDOWS 下面 一般用哪个开发工具啊, 我现在暂时用WINDOWS 弄下, LINUX 没网 我又懒得去编译, 所以用下WINDOWS 来感受下 区别~

1条回复

  • 陈默

    回复 陈默  2009年09月04日 星期五 19:42

    =。=没有瘟到死。。。用Turbo C吧
    Linux下直接有gcc多方便。。。。

    0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号