任意分布的随机数的产生方法—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)这个函数,其参数就是随机种子,但是如果给一个常量,则得到的随机序列就完全相同了,因此可以使用系统的时间来作为随机种子,因为系统时间可以保证它的随机性。
[]
- ››任意修改Powerpoint 2007中的剪贴画
- ››分布式网络爬虫关键技术分析与实现一网络爬虫相关...
- ››分布式 DBA: 创建和使用分区表
- ››分布式 Key-Value 存储系统:Cassandra 入门
- ››分布式 DBA: Cursor Stability Isolation Level 的...
- ››任意模板里调用任意栏目的文章
- ››分布式管理:用 HADR 减少停机时间(详细解释如何...
- ››分布式 DBA:存储、I/O 和 DB2,第 1 部分(针对在...
- ››分布式 DBA:使用物化查询表
- ››分布式存储系统的实现
- ››任意数学表达式计算
- ››分布式 DB2 UDB 服务器对比
更多精彩
赞助商链接