从一个数组中随机取出几个数,切不重复!

本文展示了一个使用Java实现的简单程序,该程序能够从数组中随机抽取并打印出8个不同的数字,同时通过调整数组大小和使用特定的方法来确保每次抽取都不重复。通过这个例子,读者可以了解到如何运用Java的基础语法、数组操作以及随机数生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import java.util.Arrays;

public class suiji {
    public static void main(String[] args) {
        
        int[] arrays=new  int[33];
        for(int i=1;i<34;i++) {
            arrays[i-1]=i;
        }
        int a=0;
        while(a<8) {
            a++;
            int i=(int)(Math.random()*arrays.length);
            System.out.print(arrays[i]+"\t");
            

            arrays[i] = arrays[arrays.length-1];
            
            arrays = Arrays.copyOf(arrays, arrays.length-1);
        }
        
        
    }
}
 

 

 

 

copyOf(T[] original, int newLength)
          复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。
<think>好的,我需要帮助用户生成一个基于数组随机重复菜单的Java示例代码。首先,用户明确要求使用数组,并且要确保生成的菜单项不重复。我需要考虑如何用数组来实现这一点,而不是其他数据结构比如集合或哈希表,尽管通常哈希表在去重方面更高效。但用户特别要求使用数组,所以必须用数组来处理。 首先,我需要生成随机数,然后检查是否已经存在于数组中。如果不存在,就添加到数组里。这个过程需要循环直到数组填满。这里的关键点是如何高效地检查重复。由于数组的查找效率较低,每次生成新随机数都要遍历数组检查是否存在,这可能影响性能,尤其是当数组很大时。但用户可能更关注代码的直观性,而不是性能,所以暂时可以接受这种方法。接下来,我需要考虑如何生成随机数。Java中可以使用Random类,生成指定范围内的随机数。比如用户想要生成1到100之间的不重复数,那么需要确保随机数范围足够大,避免生成次数过多导致无限循环。但用户可能没有指定范围,所以需要假设一个合理的范围,比如菜单项的总数,比如10个不同的菜单项,从0到9的索引随机选择。或者,另一种方法是使用洗牌算法(Fisher-Yates shuffle),先将所有可能的菜单项存入数组,然后随机打乱顺序,前n个元素。这样可以保证不重复且高效。但用户可能需要的是从已有菜单数组随机重复的项,而不是生成数字。所以需要明确用户的需求。 假设用户有一个菜单数组,比如String[] menuItems ={"汉堡", "披萨", "沙拉",...};,想要从中随机重复的项组成新菜单。这时候,洗牌算法就非常适合。例如,将原数组打乱顺序,然后前n个元素作为结果。这样既保证了不重复,又高效。但用户提到“生成基于数组随机重复菜单”,可能是指从数组随机选择元素,确保不重复。所以正确的做法是使用洗牌算法。例如,创建一个包含所有菜单项的数组,打乱顺序,然后选择前个作为随机菜单。现在,我需要编写示例代码。首先定义菜单数组,然后复制一份进行洗牌,最后需要的数量。这种方法避免了重复检查,因为洗牌后顺序是随机的,直接按顺序即可。但用户的问题可能更偏向于生成随机数作为菜单项,而不仅仅是选择。这时候可能需要先生成一个顺序的数字数组,然后打乱顺序,前n个。例如,生成1到100之间的不重复随机数,存入数组。这时候可以用洗牌算法,先填充数组1-100,打乱,前n个。这样避免了重复检查,效率更高。 综上所述,正确的做法是使用洗牌算法来生成不重复随机数组。这样既高效又简单。下面需要编写Java代码实现这一点。例如:1.创建一个包含所有可能值的数组。2.使用Fisher-Yates算法打乱数组。 3.根据需要前n个元素作为结果。 这样生成的数组自然是不重复的。如果用户的需求是从已有菜单项中随机选择,那么这种方法适用。如果用户需要生成新的随机数,比如1到100之间的不重复数,也可以先创建一个数组1-100,打乱后前n个。现在,我需要确认用户的具体需求。根据用户的问题描述,“生成基于数组随机重复菜单”,可能是指从已有的菜单项数组随机选择多个不重复的项。因此,使用洗牌算法是最佳选择。编写示例代码时,需要包括以下步骤:-初始化原始菜单数组。-复制原始数组以避免修改原数据。-使用循环进行洗牌,交换元素位置。-取出洗牌后的数组中的前n个元素作为结果。此外,需要处理可能的重复生成问题,但洗牌算法本身确保没有重复,因此无需额外检查。最后,需要生成相关问题,例如询问其他去重方法、性能优化或应用场景。这有助于用户进一步学习。检查代码是否符合Java语法,比如使用Random类,正确遍历数组,以及处理数组索引。确保示例代码简洁明了,用户容易理解和应用。</think>以下是使用Java数组生成随机重复菜单的示例代码,采用**洗牌算法**实现高效去重: ```java import java.util.Random; public class RandomMenuGenerator { public static void main(String[] args) { String[] allMenus = {"汉堡", "披萨", "沙拉", "牛排", "寿司", "炒饭", "汤面", "烤鸡", "薯条", "冰淇淋"}; String[] randomMenus = generateRandomMenu(allMenus, 5); System.out.println("今日推荐菜单:"); for (String menu : randomMenus) { System.out.println(menu); } } public static String[] generateRandomMenu(String[] source, int count) { // 创建副本避免修改原始数据[^3] String[] copy = source.clone(); Random rand = new Random(); // Fisher-Yates洗牌算法[^1] for (int i = copy.length - 1; i > 0; i--) { int j = rand.nextInt(i + 1); String temp = copy[i]; copy[i] = copy[j]; copy[j] = temp; } // 截前count个元素 String[] result = new String[count]; System.arraycopy(copy, 0, result, 0, count); return result; } } ``` ### 代码说明 1. **初始化数组**:`allMenus`包含所有可选菜单项 2. **洗牌算法**:通过随机交换数组元素位置实现随机排序,时间复杂度为$O(n)$ 3. **结果截**:直接打乱顺序后的前N个元素,保证不重复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值