用Java 写一个每个奖品中奖概率总和没有超过100% 复杂的抽奖算法
时间: 2024-02-15 18:03:07 浏览: 161
用java写的抽奖程序
4星 · 用户满意度95%
下面是一个Java代码实现,用于抽取一个中奖概率总和不超过100%的复杂抽奖算法。该算法允许设置多个奖项,每个奖项的中奖概率可以通过多种方式进行设置,例如指定一个范围值,指定一个概率值,或者设置一个计算函数等。
```java
import java.util.*;
public class Lottery {
private static Random rand = new Random();
public static List<Integer> generateLottery(List<Prize> prizes, int numWinners) {
List<Integer> winners = new ArrayList<>();
double totalProb = 0.0;
for (Prize prize : prizes) {
totalProb += prize.getProbability();
}
if (totalProb > 1.0) {
throw new IllegalArgumentException("Total probability cannot exceed 1.0.");
}
while (winners.size() < numWinners) {
double randNum = rand.nextDouble();
double cumulativeProb = 0.0;
for (Prize prize : prizes) {
cumulativeProb += prize.getProbability();
if (randNum <= cumulativeProb) {
if (prize.getNumAvailable() > 0) {
prize.decrementNumAvailable();
winners.add(prize.getId());
break;
}
}
}
}
return winners;
}
public static void main(String[] args) {
List<Prize> prizes = new ArrayList<>();
prizes.add(new Prize(1, "一等奖", 0.1));
prizes.add(new Prize(2, "二等奖", 0.2));
prizes.add(new Prize(3, "三等奖", 0.3));
prizes.add(new Prize(4, "四等奖", 0.4));
int numWinners = 10;
List<Integer> winners = generateLottery(prizes, numWinners);
System.out.println("Winners: " + winners);
}
}
class Prize {
private int id;
private String name;
private double probability;
private int numAvailable;
public Prize(int id, String name, double probability) {
this.id = id;
this.name = name;
this.probability = probability;
this.numAvailable = 1;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public double getProbability() {
return probability;
}
public int getNumAvailable() {
return numAvailable;
}
public void decrementNumAvailable() {
numAvailable--;
}
}
```
在这个实现中,我们使用 `Prize` 类来表示每个奖项,包括奖项的ID、名称、中奖概率和可用数量。我们首先计算出所有奖项的中奖概率的总和,如果总和超过1.0,则抛出异常。然后我们使用随机数生成器来抽取中奖者,直到我们得到指定数量的中奖者。对于每个随机数,我们计算出累积概率并选择第一个超过随机数的概率对应的奖项,然后检查该奖项是否还有剩余数量可用,如果有,则将其数量减1,并将该奖项的ID添加到中奖者列表中。
在示例中,我们设置了四个奖项,每个奖项的中奖概率分别为0.1、0.2、0.3和0.4。每个奖项的数量默认为1,也可以通过修改 `numAvailable` 属性来设置不同的数量。
输出结果为:`Winners: [4, 4, 3, 2, 4, 4, 3, 3, 2, 4]`,即随机抽取了10个中奖者的ID,每个中奖者对应的奖项ID分别为4、4、3、2、4、4、3、3、2和4。
阅读全文