首页 > C/C++语言 > C/C++数据结构 > 实现高随机度随机序列的一种方法
2006
05-26

实现高随机度随机序列的一种方法

众所周知,随机数在软件开发中是非常有用的,然而,在dos系统中得很多编程语言都不能得出令人满意的随机数,这些随机数都有以下几个缺点:


    1.值域范围小,易重复,故随机度不高.
    2.没有经过归一化,使用不便.
    3.其随机序列是固定的.
因此,尽管此随机序列内部看起来是具有随机性,但就其整个序列而言却不是随机的.即每次调用此程序结果是唯一的.因此它是个伪随机数.这里介绍一种简单的方法(混沌学).


    在混沌学中占有重要地位的叠代方程大都具有随机性.考虑如下叠代法:


    f(n+1)=af(n)[1-f(n)] f(n)在(0,1)之间,a在(1,4)之间.


上面的方程具有从f(n)->f(n+1)上的映射.方程虽然简单,但当其参数a发生变化时,迭代的结果却表现出倍周期分叉的复杂特性.利用这一特性,很容易产生高随机度的随机序列.由于方程对初值非常敏感,不同的初值对叠代的结果有很大的影响,因此,可以直接给方程赋初值来产生不同的随机数,而初值则由计算机自动产生,并应有一较大的变化范围.这样不但随机数内部,而且随机数本身也具有了随机性.由此,产生了高随机度的随机数序列.


    在编制应用程序时,需要用大量的随机数,用以上方法,可得到满意的效果.其中初值的选择是利用了dos系统的时钟产生的毫秒进行处理而得到的.初值和产生随机序列的函数都被说明为double型.下面给出了子函数清单.


#include<sys\type.h>
#include<sys\timeb.h>
#include<time.h>

#define Alpha 3.95

double random(void)/*返回一个(0,1)之间的随机数*/
{
    static double f=-1.0;
    double initvlaue();
    if(f==-1.0) f=initvalue();
    else f=alpha*f*(1.0-f);
    return f;
}

double initvalue(void)/*返回随机数序列初值*/
{
    double f0;
    struct timeb *pr;
    for(;;){
        ftime(pr);
        f0=pr->millitm*0.9876543*0.001;
        if(f0<0.001) continue;
        break;
    }
    return f0;
}


留下一个回复