以下是使用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;
    }
}

这个程序的主要思路是:

  1. 先创建一个包含所有人员编号的列表 allMembers
  2. 对于每个奖项,调用 drawPrizes 方法抽取指定数量的中奖者,并将中奖者从 allMembers 列表中移除。
  3. 输出每个奖项的中奖者列表。

其中,drawPrizes 方法的实现如下:

  1. 创建一个空的中奖者列表 winners
  2. 创建一个 Random 对象 rand 用于生成随机数。
  3. 循环指定次数 count,每次从列表 members 中随机抽取一个人员,将其添加到中奖者列表 winners 中,并将其从 members 列表中移除。
  4. 返回中奖者列表 winners

在抽取中奖者时使用了一种常用的算法:Fisher–Yates shuffle 算法,也称为 Knuth shuffle 算法,它的时间复杂度为 O(n)。该算法的步骤如下:

  1. 从待洗牌的元素中随机选取一个元素。
  2. 将它和序列的最后一个元素交换位置。
  3. 接着在剩下的元素中随机选取一个元素。
  4. 将它和倒数第二个元素交换位置。
  5. 以此类推,直到第一个元素被选中并与第二个元素交换位置。

这种算法的优点是随机性好,且不需要额外的空间。

用java实现一个年会抽奖算法,总共100人, 一等奖 2个,二等奖3个,三等奖4个

原文地址: https://www.cveoy.top/t/topic/taj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录