平均随机数的封装类

网友投稿 552 2022-11-15

平均随机数的封装类

平均随机数的封装类

核心代码从C++抄的。改进了两点:

a,种子初始化为time(null),此函数精确到秒。

b,构造函数可以指定随机数的最大值。比如:生成0到10的随机数。

c,范围从0x8ffff,扩充到0xFFFF。

class CRand{public: CRand(unsigned short uMax=0xFFFF) { m_seed = ::time(NULL); m_uMax = uMax ; for( int i = 1 ; i <= 16 ; i++ ) { if( (1 << i) > uMax ) { m_uMaxMask = ( 1 << i ) - 1 ; break; } } } int rand() { while(true) { m_seed = m_seed * 1103515245 + 12345; unsigned short r = (unsigned int)(m_seed >> 16)&m_uMaxMask ; if( r <= m_uMax ) { return r ; } } } int m_seed;protected: unsigned short m_uMaxMask; unsigned short m_uMax;};

取[0,M]的随机数:直接rand()%(M+1)不是一个好主意,0到RAND_MAX是大致随机的,但%(M+1)就可能相差很大,比如:

假定M=RAND_MAX-1,那么rand()% (m+1) 后,0,RAND_MAX两个数是0,其它都只有一个数。所以0出现的几率是其它的两倍。

下面是测试代码:

const unsigned short iMax = 0x8000-2; CRand rand1,rand2(iMax); int nums1[iMax+1]={0},nums2[iMax+1]={0}; for( int j = 0 ; j < 0x2000 ; j++ ) { rand1.m_seed = j ; rand2.m_seed = j ; for(int i = 0 ; i < 0x10000 ; i++ ) { const int r1 = rand1.rand()%(iMax+1); ASSERT( ( r1 >= 0 ) && ( r1 <= iMax)); nums1[r1]++; const int r2 = rand2.rand(); ASSERT( ( r2 >= 0 ) && ( r2 <= iMax)); nums2[r2]++; } } std::sort(nums1,nums1+iMax+1); std::sort(nums2,nums2+iMax+1);

结果见下图,方法二明显平均的多

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Win64 驱动内核编程-29.强制解锁文件
下一篇:logiscope 应用度量元 翻译和解释
相关文章

 发表评论

暂时没有评论,来抢沙发吧~