WEB开发网
开发学院软件开发VC 任意分布的随机数的产生方法—VC程序实现方法 阅读

任意分布的随机数的产生方法—VC程序实现方法

 2007-03-15 21:55:46 来源:WEB开发网   
核心提示: 这样一来,产生的随机数范围是正确的,任意分布的随机数的产生方法—VC程序实现方法(2),但是精度不正确了,变成了只有一位正确的小数的随机数了,则得到的随机序列就完全相同了,因此可以使用系统的时间来作为随机种子,后面三位的小数都是零,显然不是我们要求的

这样一来,产生的随机数范围是正确的,但是精度不正确了,变成了只有一位正确的小数的随机数了,后面三位的小数都是零,显然不是我们要求的,什么原因呢,又怎么办呢。

先找原因,rand()产生的随机数分辨率为32767,两个就是65534,而经过求余后分辨度还要减小为10000,两个就是20000而要求的分辨率为1000*10000*2=20000000,显然远远不够。下面提供的方法可以实现正确的结果:

double a = (rand()%10000) * (rand()%1000)/10000.0;
    double b = (rand()%10000) * (rand()%1000)/10000.0;
    double dValue = a-b;

则dValue就是所要求的结果。在下面的函数中可以实现产生一个在一个区间之内的平均分布的随机数,精度是4位小数。

double AverageRandom(double min,double max)
    {
    int minInteger = (int)(min*10000);
    int maxInteger = (int)(max*10000);
    int randInteger = rand()*rand();
    int diffInteger = maxInteger - minInteger;
    int resultInteger = randInteger % diffInteger + minInteger;
    return resultInteger/10000.0;
    }

但是有一个值得注意的问题,随机数的产生需要有一个随机的种子,因为用计算机产生的随机数是通过递推的方法得来的,必须有一个初始值,也就是通常所说的随机种子,如果不对随机种子进行初始化,那么计算机有一个确省的随机种子,这样每次递推的结果就完全相同了,因此需要在每次程序运行时对随机种子进行初始化,在vc中的方法是调用srand(int)这个函数,其参数就是随机种子,但是如果给一个常量,则得到的随机序列就完全相同了,因此可以使用系统的时间来作为随机种子,因为系统时间可以保证它的随机性。

上一页  1 2 3 4  下一页

Tags:任意 分布 随机数

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接