一种抽奖转盘算法

基本思路,概率总和不需要为100%,首先先算出所有的概率总和,然后随机一个值在
0到总和之间,计算这个值落入的区间是在哪个位置。这种算法较为平均。
public static Integer duageAward(List<Double> turntables){
    Double sumPbi = 0.0;
    for (Double n: turntables){
        sumPbi += n;
    }

    Integer turntableId = null;
    Double rsel = RandomUtils.nextDouble(0,sumPbi);
    for (int i = 0;i < turntables.size();i++){
        if (turntables.get(i).compareTo(rsel)<0){
            rsel = rsel - turntables.get(i);
        }else{
            turntableId = i;
            break;
        }
    }
    return turntableId;
}

public static void main(String[] args) {
    List<Double> nums = new ArrayList<>();
    nums.add(10.1);
    nums.add(20.3);
    nums.add(99.92);
    nums.add(87.80);
    nums.add(99.90);
    nums.add(99.91);
    int []arr=new int[6];
    for (Long i = 0L;i<100000000L;i++){
        int idx = duageAward(nums);
        arr[idx] = arr[idx] + 1;
    }
}

  

原文地址:https://www.cnblogs.com/forbeat/p/13055869.html