实例044 Java利用数组随机挑选一名幸运观众

发布时间 2023-05-04 17:56:45作者: 两拳ko小yu

  可以通过以下代码利用数组随机挑选一名幸运观众:

import java.util.Random;

public class LuckyDraw {
    public static void main(String[] args) {
        String[] audience = {"张三", "李四", "王五", "赵六"};
        
        //生成一个0到3之间的随机整数,作为中奖观众在数组中的下标。
        Random random = new Random();
        int index = random.nextInt(4);
        
       System.out.println("恭喜" + audience[index] + "成为本次活动的幸运儿!");
    }
}

  其中,定义了一个字符串类型的数组audience表示所有参加抽奖活动的观众。使用Java自带类Random来生成一个0到3之间(包括边界) 的 随 机 整 数 , 并 将 其 赋 值 给 变 量index 。 最 后 输 出 中 奖 观 众 名 称 和 恭贺语句即可。

  需要注意:如果要多次进行抽奖操作,则应该将上述代码放入循环体内,并且每轮结束后清空已经被选过得人员信息或者记录哪些人已经获胜等相关数据。

  如果要进行多次抽奖操作,可以将上述代码放入循环体内,并且每轮结束后清空已经被选过得人员信息或者记录哪些人已经获胜等相关数据。以下是一个示例:

import java.util.Random;

public class LuckyDraw {
    public static void main(String[] args) {
        String[] audience = {"张三", "李四", "王五", "赵六"};
        
        //设置需要抽取的幸运观众数量和总参与人数。
        int luckyCount = 2;
        int totalAudience = audience.length;
        
       for (int i=1; i<=luckyCount; i++) { 
            Random random=new Random();
            
            //如果想保证不重复中奖,则在数组audience中删除掉之前中过奖的元素即可。
            int index=random.nextInt(totalAudience);
           
           System.out.println("恭喜第" +i+ "位幸运儿:" + audience[index] +"!");
          
          //从数组audience 中 删除 已 经 被 抽 中 的 观 众 名 称 , 避 免 下 次 再 次 投 票 或 可能出现同一名观众连续两次成为幸运儿情况发生
         List<String> list= new ArrayList<>(Arrays.asList(audiences));
         list.remove(index);  
         
         audiences=list.toArray(new String[0]);
      }
   }
}

  其中,定义了字符串类型的数组audiences表示所有参加抽奖活动的观众。设置需要抽取的幸运观众数量和总参与人数,然后使用循环进行多次随机选取操作。

  在每轮中,生成一个0到3之间(包括边界) 的 随 机 整 数 , 并 将 其 赋 值 给 变 量index 。 最 后 输 出 中 奖 观 众 名 称 和 恭贺语句即可。

  如果想保证不重复中奖,则可以将已经被选过得人员信息从数组audiences删除掉避免下一次再次投票或可能出现同一名观众连续两次成为幸运儿情况发生。

  如果想要保证每个人都有机会中奖,可以采用洗牌算法(Fisher-Yates shuffle)来打乱数组顺序。以下是一个示例:

import java.util.Random;

public class LuckyDraw {
    public static void main(String[] args) {
        String[] audience = {"张三", "李四", "王五", "赵六"};
        
        //设置需要抽取的幸运观众数量和总参与人数。
        int luckyCount = 2;
        int totalAudience = audience.length;
        
       for (int i=1; i<=luckyCount; i++) { 
            Random random=new Random();
            
            //使用 Fisher–Yates 洗牌算法随机打乱数组audiences 的元素位置。
           for(int j=totalAudience-1;j>=0;j--){
               int index=random.nextInt(j+1);
               
                String temp=audience[index];
                audiences[index]=audiences[j];
                audiences[j]=temp;
           }
           
          System.out.println("恭喜第" +i+ "位幸运儿:" + audience[0] +"!");
          
         //将已经被选过得观众从数组中删除掉,并更新剩余可供选择的名单长度
         List<String> list=new ArrayList<>(Arrays.asList(audiences));
         
         list.remove(0);  
         
         totalAudience--;
         
          if(totalAudience==0){
              break;//如果所有参加者均已获胜,则结束循环操作.
          }   
      }
   }
}

  在上述代码中,在进行多次随机选取操作之前,使用Fisher-Yates洗牌算法随机打乱数组audiences的元素位置。这样可以保证每个人都有平等的中奖概率。

  在每轮抽奖结束后,将已经被选过得观众从数组中删除掉,并更新剩余可供选择的名单长度。如果所有参加者均已获胜,则结束循环操作。

  需要注意:由于是通过修改原始数据来实现去重和缩减候选集合大小,在多线程或分布式场景下可能会存在并发问题,请根据具体情况进行处理。