权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100;
简单实现代码如下:
import java.util.ArrayList; import java.util.List; import java.util.Random; public class WeightRandom { static List<WeightCategory> categorys = new ArrayList<WeightCategory>(); private static Random random = new Random(); public static void initData() { WeightCategory wc1 = new WeightCategory("A",60); WeightCategory wc2 = new WeightCategory("B",20); WeightCategory wc3 = new WeightCategory("C",20); categorys.add(wc1); categorys.add(wc2); categorys.add(wc3); } public static void main(String[] args) { initData(); Integer weightSum = 0; for (WeightCategory wc : categorys) { weightSum += wc.getWeight(); } if (weightSum <= 0) { System.err.println("Error: weightSum=" + weightSum.toString()); return; } Integer n = random.nextInt(weightSum); // n in [0, weightSum) Integer m = 0; for (WeightCategory wc : categorys) { if (m <= n && n < m + wc.getWeight()) { System.out.println("This Random Category is "+wc.getCategory()); break; } m += wc.getWeight(); } } } class WeightCategory { private String category; private Integer weight; public WeightCategory() { super(); } public WeightCategory(String category, Integer weight) { super(); this.setCategory(category); this.setWeight(weight); } public Integer getWeight() { return weight; } public void setWeight(Integer weight) { this.weight = weight; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } }
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/11005.html