场景:通过做任务随机生成一个任务碎片,并且通过其设置的权重计算产出的概率;
代码实现:
/**
* 根据任务碎片权重获取一个碎片
* @return MfxyTaskFragment
* 说明:
* 首先计算出待选奖品的总权重,这样做的目的是可以随意设置奖品权重,不必再考虑权重之和是否等于100。
* 随机规则是首先生成一个随机数randomNumber(生成的随机数位于0到1的左开右闭区间),
* 然后分别计算出当前奖品前前面所有有奖品(不包括当前奖品)的概率和d1和当前奖品后面(包括当前奖品)所有奖品的概率和d2,
* 然后判断生成的随机数randomNumber是否已处于d1和d2之间,如果处于该区间之内则当前奖品将被抽中。
*/
public MfxyTaskFragment PercentageRandomFragment(List<MfxyTaskFragment> prizes) {
int random = -2;
try{
double sumWeight = 0;
//计算总权重
for(MfxyTaskFragment rp_1 : prizes){
sumWeight += rp_1.getWeight();
}
double randomNumber;
randomNumber = Math.random();
System.out.println("randomNumber是:" + randomNumber);
double d1 = 0;
double d2 = 0;
for(int i=0;i<prizes.size();i++){
d2 += Double.parseDouble(String.valueOf(prizes.get(i).getWeight()))/sumWeight;
if(i==0){
d1 = 0;
}else{
d1 +=Double.parseDouble(String.valueOf(prizes.get(i-1).getWeight()))/sumWeight;
}
if(randomNumber >= d1 && randomNumber <= d2){
random = i;
System.out.println("d1是:" + d1);
System.out.println("d2是:" + d2);
break;
}
}
}catch(Exception e){
System.out.println(e.getMessage());
random = -1;
}
return prizes.get(random);
}