用java实现一个年会抽奖算法,总共100人, 一等奖 2个,二等奖3个,三等奖4个
以下是使用Java编写的年会抽奖算法,共抽取100人中的2个一等奖、3个二等奖、4个三等奖:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class AnnualMeetingLottery {
public static void main(String[] args) {
// 总共100人
List<Integer> allMembers = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
allMembers.add(i);
}
// 一等奖2个
List<Integer> firstPrizes = drawPrizes(allMembers, 2);
System.out.println("一等奖:");
for (int i = 0; i < firstPrizes.size(); i++) {
System.out.println("第" + (i + 1) + "个中奖者是:" + firstPrizes.get(i));
}
// 二等奖3个
List<Integer> secondPrizes = drawPrizes(allMembers, 3);
System.out.println("二等奖:");
for (int i = 0; i < secondPrizes.size(); i++) {
System.out.println("第" + (i + 1) + "个中奖者是:" + secondPrizes.get(i));
}
// 三等奖4个
List<Integer> thirdPrizes = drawPrizes(allMembers, 4);
System.out.println("三等奖:");
for (int i = 0; i < thirdPrizes.size(); i++) {
System.out.println("第" + (i + 1) + "个中奖者是:" + thirdPrizes.get(i));
}
}
/**
* 从指定人员列表中随机抽取指定数量的中奖者。
* @param members 指定人员列表
* @param count 指定数量
* @return 中奖者列表
*/
private static List<Integer> drawPrizes(List<Integer> members, int count) {
List<Integer> winners = new ArrayList<>();
Random rand = new Random();
int size = members.size();
for (int i = 0; i < count; i++) {
int index = rand.nextInt(size - i);
winners.add(members.get(index));
Collections.swap(members, index, size - i - 1);
}
return winners;
}
}
这个程序的主要思路是:
- 先创建一个包含所有人员编号的列表
allMembers。 - 对于每个奖项,调用
drawPrizes方法抽取指定数量的中奖者,并将中奖者从allMembers列表中移除。 - 输出每个奖项的中奖者列表。
其中,drawPrizes 方法的实现如下:
- 创建一个空的中奖者列表
winners。 - 创建一个
Random对象rand用于生成随机数。 - 循环指定次数
count,每次从列表members中随机抽取一个人员,将其添加到中奖者列表winners中,并将其从members列表中移除。 - 返回中奖者列表
winners。
在抽取中奖者时使用了一种常用的算法:Fisher–Yates shuffle 算法,也称为 Knuth shuffle 算法,它的时间复杂度为 O(n)。该算法的步骤如下:
- 从待洗牌的元素中随机选取一个元素。
- 将它和序列的最后一个元素交换位置。
- 接着在剩下的元素中随机选取一个元素。
- 将它和倒数第二个元素交换位置。
- 以此类推,直到第一个元素被选中并与第二个元素交换位置。
这种算法的优点是随机性好,且不需要额外的空间。
原文地址: https://www.cveoy.top/t/topic/taj 著作权归作者所有。请勿转载和采集!