平均随机数的封装类
来源:互联网 发布:西游记 知乎 编辑:程序博客网 时间:2024/06/05 22:50
核心代码从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);结果见下图,方法二明显平均的多
阅读全文
0 0
- 平均随机数的封装类
- 对自己的“平均随机数封装类”的测试
- c++/c 产生随机数(平均分布)
- Swift中随机数的使用,对不同类型随机数进行封装调用
- 生成随机数的类
- 惊人的答案:平均要取多少个(0,1)中的随机数才能让和超过1
- [zz] 惊人的答案:平均要取多少个(0,1)中的随机数才能让和超过1
- 惊人的答案:平均要取多少个(0,1)中的随机数才能让和超过1
- 惊人的答案:平均要取多少个(0,1)中的随机数才能让和超过1
- 自定义的随机数生成类,“01二值随机数”,“01浮点随机数”,“0n整随机数”
- 被平均("统计平均")的陷阱
- 股市的平均收益
- 一个获得随机数的类
- 一个方便的随机数类
- PHP生成随机数的类
- 一个生成随机数的类
- C#产生随机数的类
- Random:产生随机数的类
- python Numpy中array详解
- 微信红包内容读取
- 1253:Dungeon Master(2.5基本算法之搜索)
- jquery 判断js中是否包含字符串
- Excel潜能系列——Excel游戏 2048
- 平均随机数的封装类
- Java面试2 ,3事(一)
- 图片使用base64图片数据格式上传(后台使用springMVC)
- 解决maven项目不会预读xml文件,Invalid bound statement (not found): com.starry.dao.IUserDao.selAll
- 戴凌龙, MIMO, OFDM, 5G
- Android--adb命令查看第三方应用包名、应用activity名
- 快速排序和归并排序算法
- linux 磁盘满了,查看文件大小
- C#学习回顾笔记一:C#的Console.WriteLine()