天天看点

随机获得用户定义的整数实现

辅助类提供了3个方法:

(1)addWeightNumber(int weight,int num):为某个num赋予weight权重,此权重代表此数字在随机获取时的获得概率;权重大, 则获得的概率就大,权重小,则获得的概率就小。

(2)addWeightNumRange(int weight,int numfrom,int numto,int ... numExcludes);同时为连续多个数字赋予权重,最后这个参数可以排除例外数字,比如addWeightNumRange(5,1,10,5); 表示为1~10(除去5)的数字赋予权重5;

(3)getNextInt();在你赋予权重之后,此方法会随即在你赋予权重的这些数字之中取出一个;

优点:此方法和new Random().nextInt()的优势在于,可以为每个数字赋予权重,并且可以随机取出用户指定的数字集合;

package org.xiazdong.util; import java.util.ArrayList; import java.util.List; import java.util.Random; public class IntegerWeightRandom { private List<Integer> weights = new ArrayList<Integer>(); private List<List<Integer>> numbers = new ArrayList<List<Integer>>(); private Integer totalWeight; private Random random = new Random(); public IntegerWeightRandom() { } private Integer getTotalWeight(){ if(totalWeight == null){ totalWeight = 0; for(Integer weight:weights){ totalWeight += weight; } } return totalWeight; } //此函数表示一个weight对应一个number public void addWeightNumber(int weight,int num){ weights.add(weight); List<Integer> list = new ArrayList<Integer>(); list.add(num); numbers.add(list); } //此函数表示一个weight对应多个number public void addWeightNumRange(int weight,int numFrom,int numTo,int...numExcludes){ weights.add(weight); List<Integer> list = new ArrayList<Integer>(); for(int i = numFrom;i <= numTo;i++){ boolean exclude = false; for(int numExclude:numExcludes){ if(i == numExclude){ exclude = true; } } if(!exclude){ list.add(i); } } numbers.add(list); } //此函数为随机取一个整数(按照权重概率取) public Integer getNextInt(){ int weightRandom = random.nextInt(getTotalWeight()); int weightCount = 0; for(int i = 0;i < weights.size();i++){ int weight = weights.get(i); if(weightRandom >= weightCount && weightRandom < weightCount + weight){ List<Integer> numList = numbers.get(i); if(numList.size() == 1){ return numList.get(0); } int numRandom = random.nextInt(numList.size()); return numList.get(numRandom); } weightCount += weight; } return null; } }

测试类:

package test.org.xiazdong.util; import org.junit.Test; import org.xiazdong.util.IntegerWeightRandom; public class IntegerWeightRandomTest { @Test public void testGetNextInt(){ IntegerWeightRandom random = new IntegerWeightRandom(); random.addWeightNumber(1, 0); random.addWeightNumber(5, 1); random.addWeightNumber(9, 2); random.addWeightNumber(15, 3); random.addWeightNumber(20, 4); random.addWeightNumber(30, 5); random.addWeightNumber(40, 7); random.addWeightNumber(50, 6); random.addWeightNumber(60, 8); random.addWeightNumber(70, 9); for(int i=0;i<10;i++){ System.out.println(random.getNextInt()); } } }