抽奖思路

/ 0评 / 0

我实现抽奖的思路也是利用随机数,以及分段的思维完成的,我忘记我再哪里看到的这个方法,不过理解了其中的思路,想忘记都难,主要就是分段概率。

假设我们有3个奖品,手机——概率为30;电脑——概率为10;电视——概率为20。

首先我们将每个奖品的概率相加,得到总概率为50,并进行分段,例如:

0~30:手机,如果是0~30以内的数字,表示抽中的手机,而它的概率为3/6

31~40(30+10):电脑,如果 31~40 以内的数字,表示抽中的是电脑,而它的概率为1/6

41~50(30+10+20):电视, ,如果 41~60 以内的数字,表示抽中的是电脑,而它的概率为2/6

试想一下,我们随机一个数,然后把这个数字与上面的分段数,去比较,如果在某个段内,就说明抽中了什么奖。

抽奖思路图
抽奖思路

实现代码

首先我们需要一个奖品类,里面有奖品的名字,奖品的概率属性

public class Award {

private String name;

private Integer chance;

private Integer count;

public Integer getCount() {
return count;
}

public void setCount(Integer count) {
this.count = count;
}

public Award(String name, Integer chance, Integer count) {
this.name = name;
this.chance = chance;
this.count = count;
}

public Award(String name, Integer chance) {
this.name = name;
this.chance = chance;
}

public Award() {
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getChance() {
return chance;
}

public void setChance(Integer chance) {
this.chance = chance;
}

@Override
public String toString() {
return "Award [name=" + name + ", chance=" + chance + ", count=" + count + "]";
}

}

抽奖类

public class Lottery {

public static void main(String[] args) {

Award a1 = new Award("手机一台", 30);
Award a2 = new Award("电脑一台", 10);
Award a3 = new Award("电视一台", 20);

List<Award> list = new LinkedList<Award>();
list.add(a1);
list.add(a2);
list.add(a3);

int[] chances = new int[list.size()];

int sum = 0;
for (int i = 0; i < list.size(); i++) {
sum += list.get(i).getChance();
chances[i] = sum;
System.out.println(chances[i]);
}

Map<String, Integer> map = new HashMap<String, Integer>();
Random random = new Random();

// 模拟抽奖100次
for (int j = 0; j < 100; j++) {
int index = random.nextInt(sum) + 1;
System.out.println("总中奖数:" + sum + "中奖数:" + index);
int i = 0;
for (; i < chances.length; i++) {
if (index <= chances[i]) {
break;
}
}

if (map.containsKey(list.get(i).getName())) {
map.put(list.get(i).getName(), map.get(list.get(i).getName()) + 1);
} else {
map.put(list.get(i).getName(), 1);
}

}
System.out.println(map);
}

}

中奖结果:{手机一台=51, 电视一台=29, 电脑一台=20}

如果你对本文感兴趣,相信你也会对另一篇文章感兴趣——《如何公平的洗牌》

发表评论

电子邮件地址不会被公开。 必填项已用*标注