随机 概率 选中 算法实现
来源:互联网 发布:手机五毛钱特效软件 编辑:程序博客网 时间:2024/06/08 03:47
因为最近项目中要完成,判断一件事情依照指定概率,随机的是否能被抽中?这样就是一个简单的随机算法实现。
说个简单的例子,比如:
一个常见的场景,在游戏中打一个怪物,10%几率出现miss,那么这次攻击是命中还是miss呢?我们可以用随机数来实现,miss的范围是[1,10],命中的范围是[11,100],然后我们取一个随机数,比如60就是命中了,如果不幸取到8就是miss了。只要测试的次数足够多,那么miss的比例将会趋向于10%。
再比如说,很多网站上面的转盘抽奖的例子,比如一个大圆盘,按照面积来划分,10%的区域是一等奖,20%是二等奖,30%是三等奖,40%是未中奖,那么你现在准备转一次,请问,这次我到底该中几等奖还是不中奖?这个过程是用算法怎么实现的?
很简单,利用随机数来实现。
比如a概率为10%,b概率为20%,c概率为30%,d概率为40%,那么他们的概率值范围分别是:
a[1,10]
b[11,30]
c[31,60]
d[61,100]
然后取一个[1,100]的随机数,落到谁的范围谁就是选中了。
这个就是最基本,最简单的过程了,现在看下面的实现:
public class Test { /** * 概率选择 * @param keyChanceMap key为唯一标识,value为该标识的概率,是去掉%的数字 * @return 被选中的key。未选中返回null */ public static String chanceSelect(Map<String, Integer> keyChanceMap) { if(keyChanceMap == null || keyChanceMap.size() == 0) return null; Integer sum = 0; for (Integer value : keyChanceMap.values()) { sum += value; } // 从1开始 Integer rand = new Random().nextInt(sum) + 1; for (Map.Entry<String, Integer> entry : keyChanceMap.entrySet()) { rand -= entry.getValue(); // 选中 if(rand <= 0) { return entry.getKey(); } } return null; } }当然,你也可以写个测试类,来看看,不过,你会发现,落在每个区间内的数值量刚好和比例是一致的,尤其是在数量比较大的时候,更明显。
在这里用到了hashmap,其实map和数值有点像,都是一个key对一个value,只不过数值下标是固定的0,1,2,3.。。而map比较灵活。感觉这种算法比较有意思。记录一下。
0 0
- 随机 概率 选中 算法实现
- 随机概率算法
- 等概率随机洗牌算法
- 概率分析和随机算法
- 等概率随机抽样算法
- 概率分析和随机算法
- 非等概率随机算法
- 随机算法1之概率算法
- 算法导论概率分析和随机算法
- 随机算法和概率分析的区别
- 游戏里随机概率选择算法
- 随机算法--之等概率生成器
- 6.10 概率分析和随机算法
- 第五章 概率分析和随机算法
- [UVALive 6955 Finding Lines]概率+随机算法
- 概率分析与随机算法小结
- 第五章 概率分析和随机算法
- 一定概率选中某一个字母怎么实现 ?
- Qt 无边框、透明、可移动个性窗口
- replaced element / non-replaced element : 内容决定
- 高并发下的Node.js与负载均衡, 坑
- 先验概率与后验概率的区别
- live555 vs2010编译版本
- 随机 概率 选中 算法实现
- android ListView 设置header和footer的问题
- 认识4G地址空间的局限----MMIO内存映射的问题
- C#语法 using
- 奶牛的锻炼
- 机器码
- svn the post request returned invalid xml in the responese: XML parse | Commit - 500 Internal Server
- 支持Sybase ASA9 (SQLAnywhere9.0)数据库访问的Sybase Central客户端
- 基本数据结构:循环单链表