rates is the probability of winning, for example: 0.3, 0.5, 0.2
package com.ddb.activity.base.util; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Random; public class LotteryProbabilityUtil { public static void main(String[] args) { List<BigDecimal> rates=new ArrayList<BigDecimal>(); rates.add(new BigDecimal("0.01")); rates.add(new BigDecimal("0.2")); //rates.add(new BigDecimal("0.3")); //rates.add(new BigDecimal("0.2")); rates.add(new BigDecimal("0.2")); rates.add(new BigDecimal("0.09")); // int j=0; for(int i=0;i<10;i++){ int a=LotteryProbabilityUtil.getRandomIndex(rates); System.out.println(a); if(a==0){ // System.out.println(++j); } // } } /** * Calculate the probability * @param rates * @return the drawn position */ public static int getRandomIndex(List<BigDecimal> rates) { Random random = new Random(); BigDecimal ranNum = new BigDecimal(random.nextDouble()); BigDecimal sumRate = new BigDecimal("0.0"); for(BigDecimal rate:rates) { sumRate = sumRate.add(rate); } BigDecimal minVal = new BigDecimal("0.0"); BigDecimal maxVal = new BigDecimal("0.0"); for (int i = 0; i < rates.size(); i++) { BigDecimal rangeVal = rates.get(i).divide(sumRate, BigDecimal.ROUND_HALF_EVEN); maxVal = minVal.add(rangeVal); boolean exp1 = false; if(i == 0) { exp1 = (minVal.compareTo (ranNum) <= 0); } else { exp1 = (minVal.compareTo (ranNum) <0); } if(exp1&&(ranNum.compareTo(maxVal)<=0)) { return i; } minVal = minVal.add (rangeVal); } throw new RuntimeException("Get Random Index Error"); } }