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

Posted SwapEnd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实例044 Java利用数组随机挑选一名幸运观众相关的知识,希望对你有一定的参考价值。

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

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的元素位置。这样可以保证每个人都有平等的中奖概率。

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

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

Java:一次从数组中选择几个不同的随机数

【中文标题】Java:一次从数组中选择几个不同的随机数【英文标题】:Java: pick several different random numbers from array in one time 【发布时间】:2011-12-07 02:33:01 【问题描述】:

谁能告诉我如何一次从一个数组中挑选几个不同的随机数? 例如,有一个 long int 数组。我想从中挑选7个数字。所有数字不能相同,并按递增顺序排序。

Random random = new Random();
int a = mixColor[random.nextInt(mixColor.length)];
int b = mixCoor[random.nextInt(mixCoor.length)];
int c = mixCoor[random.nextInt(mixCoor.length)];
int d = mixCoor[random.nextInt(mixCoor.length)];
int e = mixCoor[random.nextInt(mixCoor.length)];
while(b!=c && c!=d && b!=d) 
   b = mixCoor[random.nextInt(mixCoor.length)];
   c = mixCoor[random.nextInt(mixCoor.length)];
   d = mixCoor[random.nextInt(mixCoor.length)];

mixColor[]mixCoor[] 是长整型数组。我可以这样做,但是如果我想选择更多的数字,这将非常复杂。我还需要对它们进行排序。有人有好主意吗?

【问题讨论】:

根据您的收藏有多大,您可以使用随机播放,然后根据需要选择前几个元素。您可能想要对此进行基准测试 - 您的集合可能足够大,并且 shuffle 可能会很慢,这会取消您从中获得的简单性。这是shuffle 的规范 更好的方法是使用Random 编号生成并查看选择的列表是否已经在生成的索引处具有编号。然后使用Collections 进行排序 【参考方案1】:

试试这个方法:

public static int[] pickNRandom(int[] array, int n) 

    List<Integer> list = new ArrayList<Integer>(array.length);
    for (int i : array)
        list.add(i);
    Collections.shuffle(list);

    int[] answer = new int[n];
    for (int i = 0; i < n; i++)
        answer[i] = list.get(i);
    Arrays.sort(answer);

    return answer;


像这样使用它:

int[] mixColor = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0;
int[] randomPicks = pickNRandom(mixColor, 5);

该方法保证完全随机选择n 元素,并且它们将按排序返回。它还保证不会多次选择任何元素,并且结果数组不会有重复,只要输入数组是无重复的。

上面的代码可以正常工作,但是必须在intInteger 之间来回切换很麻烦,而且如果输入数组很大(例如,> 100.000 个元素),它可能会很慢。先测试一下,看看它是否符合您的需求。

【讨论】:

【参考方案2】:
Random gen = new Random();
int max = mixCoor.length; // Maximum Random value to generate

ArrayList<Integer> picked = new ArrayList<Integer>(); // List of picked numbers

for(int i = 0; i < numToBePicked; i++) 
  int index = gen.nextInt(max);
  if(!picked.contains(mixCoor[index]) // If the number isn't already picked
    picked.add(mixCoor[index]); // Add it to the "picked" list


Collections.sort(picked); // Sort the picked numbers into ascending order

【讨论】:

【参考方案3】:

您可以使用现有的 java API 做任何您想做的事情:

public static Integer[] pickRandom(Integer[] array, int number) 
    List<Integer> list = new ArrayList<Integer>(Arrays.asList(array));
    Collections.shuffle(list);
    list = list.subList(0, number);
    Collections.sort(list);
    return list.toArray(new Integer[number]);

注意:您需要使用 Integer[] 而不是 int[] 来调用它,因此您必须自己转换它。此外,虽然在代码大小和复杂性方面“高效”,但这在性能方面并不是那么高效(尽管它可能仍然可用)。如果您以 List&lt;Integer&gt; 开头,则此代码会更简单。

【讨论】:

【参考方案4】:
Random random  new Random();
for (int i=0;i<7;i++)
int a = mixColor[random.nextInt()%mixColor.length];

当然,您可以使用随机种子并获得更多随机数

【讨论】:

这个答案缺少 OP 要求的几件事:不能重复随机数和排序。请参阅上面乔恩的回答。

以上是关于实例044 Java利用数组随机挑选一名幸运观众的主要内容,如果未能解决你的问题,请参考以下文章

老牌装机神器“驱动精灵”的没落:随机挑选一名幸运儿进行限速广告全家桶……

Java实现抽奖幸运儿

Java实现抽奖幸运儿

如何利用Python随机从list中挑选一个元素

js手机号批量滚动抽奖代码实现

抽取幸运观众