Aimd's Blog

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::
CRT函数rand()返回一个整型随机数,在0到RAND_MAX之间平均分布。根据数学上的随机数理论,可以运用线性变换把整型随机数转化为指定范围内的随机数。如果对精度要求比较高,可以用浮点数或者双精度数进行这个线性变换:
#define GetRandom(min,max) rand()*((float)((max)-(min)))/(float)(RAND_MAX)+(min)

http://msdn.microsoft.com/library/en-us/vclib/html/_crt__beginthread.2c_._beginthreadex.asp中的求余变换
/* GetRandom returns a random integer between min and max. */
#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))

有可能存在一定的误差。实际上,这个求余算法只是把(0,RAND_MAX-(RAND_MAX% (int)(((max) + 1) - (min))))线性变换到( min, max ) 而已,误差的数学期望是((RAND_MAX % (int)(((max) + 1) - (min)))/RAND_MAX。如果RAND_MAX可以被范围整除,那么这个算法没有误差;在范围很小,并且min和max都是整数的时候,由于分母是RAND_MAX,所以这个算法的误差甚至可能比浮点数运算的舍入误差还要小。综上所述,上面的求余变换在指定的范围很小的时候可以作为一种可行的随机数产生方法。
posted on 2006-05-15 17:34  Aimd  阅读(695)  评论(0)    收藏  举报