浏览 1857 次
锁定老帖子 主题:概率选中的算法实现
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-10
再举多个候选数的例子。比如a概率为20%,b概率为30%,c概率为40%,d概率为10%,那么他们的概率值范围分别是: a[1,20] b[21,50] c[51,90] d[91,100] 然后取一个[1,100]的随机数,落到谁的范围谁就是选中了。 算法描述如下: 1.依次(顺序可随机)将各项按概率值从原点开始放在一维坐标上首尾相连,这样每一项对应一个取值区间 2.在总区间范围内随机选取一个点,落在哪一项对应的区间就选中哪一项 java实现: public class RandomEngine { /** * 概率选择 * @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; } } 测试(次数足够多时,各值出现的比例跟概率是基本一致的): public class RandomEngineTest { public static void main(String[] args) { Map<String, Integer> keyChanceMap = new HashMap<String, Integer>(); keyChanceMap.put("a", 30); keyChanceMap.put("b", 10); keyChanceMap.put("c", 40); keyChanceMap.put("d", 20); Map<String, Integer> count = new HashMap<String, Integer>(); for (int i = 0; i < 100000; i++) { String key = RandomEngine.chanceSelect(keyChanceMap); if(count.containsKey(key)) { count.put(key, count.get(key) + 1); } else { count.put(key, 1); } } // print for (String key : count.keySet()) { System.out.println(key + ":" + count.get(key)); } } } 参考:http://blogread.cn/it/article.php?id=4102 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |