实际中常用的一个随机数产生器(分类别概率随机)

上传人:飞*** 文档编号:5372206 上传时间:2017-08-30 格式:DOCX 页数:7 大小:32.08KB
返回 下载 相关 举报
实际中常用的一个随机数产生器(分类别概率随机)_第1页
第1页 / 共7页
实际中常用的一个随机数产生器(分类别概率随机)_第2页
第2页 / 共7页
实际中常用的一个随机数产生器(分类别概率随机)_第3页
第3页 / 共7页
实际中常用的一个随机数产生器(分类别概率随机)_第4页
第4页 / 共7页
实际中常用的一个随机数产生器(分类别概率随机)_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《实际中常用的一个随机数产生器(分类别概率随机)》由会员分享,可在线阅读,更多相关《实际中常用的一个随机数产生器(分类别概率随机)(7页珍藏版)》请在金锄头文库上搜索。

1、已知一件事物有几种状态,每种状态出现的概率不一样,要求做一个随机数产生器,返回状态值,要求状态值出现的规律,符合输入的概率。这是小弟上午问我的问题,我们正在做一个工业测试模型,实际的例子是,根据实际情况,某种设备返回的状态概率符合下表:设备状态 百分比1 12%2 40%3 40%4 7%5 1%要求写段代码,模拟设备的上述行为。我下午上班想了一下,花了半个小时为他写了一个随机数产生器,经测试,0bug,呵呵。他现在正在用。Code:1. #define CTonyRandomArea_TOKEN_MAX 100 /最大类型数 2. #define CTonyRandomArea_TOKEN_

2、AREA_MAX 10000 /类型数组单元数,精确到小数点后两位 3. /输入最大 100 个元素的数组,每个数组表示每类占有的百分比,内部自带百分比调整。 4. /即如果外部输入的数字之和不是整数 100,内部会根据百分比,自动调整其比例,使总和=100.0 5. /然后内部建立 10000 个单元的类型数组,根据传入的每种类型的比例,在类型数组中批量填充对应的类型值 6. /总之,类型数组中每种类型的数量,占据的比例正好是输入的百分比 7. /最后,在 010000 中取随机,然后在对应的类型数组单元中取类型值,即为返回的类型 8. class CTonyRandomArea 9. 10

3、. public: 11. CTonyRandomArea(double* pTokenPercentArray,char cTokenCount) 12. 13. m_nTokenCount=cTokenCount; 14. if(CTonyRandomArea_TOKEN_MAXnTypeIndex) nTypeIndex=0; 96. return m_cTokenPercentArrayAreaUpnTypeIndex; 97. 98. /真实的工作函数,利用输入的概率来产生随机 type 99. char GetRandomType(void) 100. 101. return Ge

4、tType(GetRandomBetween(0,10000); 102. 103.private: 104. double m_dTokenPercentArrayCTonyRandomArea_TOKEN_MAX; /比例数组 105. short m_sTokenPercentArrayCTonyRandomArea_TOKEN_MAX; /比例数组,短整型,110000,相当于精确到小数点后两位 106. char m_nTokenCount; 107. char m_cTokenPercentArrayAreaUpCTonyRandomArea_TOKEN_AREA_MAX; /类型

5、数组 108.; 109./这是测试代码 110.void TestCTonyRandomArea(void) 111. 112. double dTokenPercentArray100; 113. 114. dTokenPercentArray0=12.0; 115. dTokenPercentArray1=40.0; 116. dTokenPercentArray2=40.0; 117. dTokenPercentArray3=7.0; 118. dTokenPercentArray4=1.0; 119. 120. CTonyRandomArea Area1(dTokenPercentA

6、rray,5); 121. Area1.PrintfInfo(); 122. 123. int i=0; 124. for(i=0;inBegin) nBegin=-nBegin; 12. if(0nEnd) nEnd=-nEnd; 13. if(nBeginnEnd) 14. 15. nBetween=nEnd; 16. nEnd=nBegin; 17. nBegin=nBetween; 18. 19. else if(nBegin=nEnd) 20. nEnd=nBegin+10; 21. nBetween=nEnd-nBegin; 22. n=n%nBetween; 23. n+=nBe

7、gin; 24. return n; 25. 上述代码是我匆忙写的,属于测试用代码,不完全符合 0bug 一书里面的 C/C+无错化程序设计原则,各位读者请注意哈。不过,虽然是测试代码,但是带了很多工程型代码的影子,大家有兴趣可以看看。另外,上述代码没有做锁封装,但是,仍然是多线程安全的。大家有注意到没有?因为其工作原理是查表法,所有的表构造时一次生成,以后仅仅是纯读,请0bug-C/C+商用工程之道的读者注意 2.3.6 节,P50 页的论述,“用锁的最高境界-不用”,这里符合第 1 条特例,“针对一个资源的所有操作都是读的时候,可以不加锁”。我这段代码可以算作实例了。各位读者可以参考一下。

8、好吧,就这么多,大家有兴趣可以看看。嗯,有人可能说,这里的随机数产生器没有使用 srand 初始化,记住,我在用我自己的工程库,也就是0bug-C/C+商用工程之道的工程库,工程库的 init 动作里面已经做过这种动作了。代码是 VS2008 下测试的,不过,我的理解,应该是跨平台的。上述代码在很多游戏开发中可以投入实用的。比如说,某个 NPC 哨兵,他可能在某个时刻,看前后左右,或者抽烟,或者睡觉,或者和另一个哨兵聊天,这时候,可以用这个随机数产生器,根据预设的每种动作的概率,权重,随时求出他的行为种类,并予以展示。再或者,暗黑里面,我们使用暗金的装备,每次攻击,有百分之多少的概率出现压碎性打击,有多少概率出现冰冻属性,等等,也可以用这个随机数产生器来求。大家慢慢想吧,呵呵。嗯,这里网友发现一处 bug,我已经修改了,请昨天看过的朋友注意:Code:1. if(100.0!=dNumberCount) 2. 3. for(i=0;im_nTokenCount;i+) 4. 5. m_dTokenPercentArrayi/=dNumberCount; 6. m_dTokenPercentArrayi*=100; /这里少乘了个 100,百分比动态调整失效,因此,我加上了这一句。 7. 8.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号