Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无重复Java的随机元素生成_Java_Arrays_Duplicates - Fatal编程技术网

无重复Java的随机元素生成

无重复Java的随机元素生成,java,arrays,duplicates,Java,Arrays,Duplicates,我试图让这段代码在没有重复的情况下运行,但在这方面的研究没有成功 这是我正在做的一个问题的开始,它将要求用户输入缺少的元素。然而,当我生成随机元素时,我会得到重复的元素 import java.util.Random; public class QuestionOneA2 { public static void main(String[] args) { String[] fruit = {"orange", "apple", "pear", "bannana",

我试图让这段代码在没有重复的情况下运行,但在这方面的研究没有成功

这是我正在做的一个问题的开始,它将要求用户输入缺少的元素。然而,当我生成随机元素时,我会得到重复的元素

import java.util.Random;

public class QuestionOneA2 {

    public static void main(String[] args) {

        String[] fruit = {"orange", "apple", "pear", "bannana", "strawberry", "mango"};
        Random numberGenerator = new Random();

        for (int i = 0; i < 5; i++) {
            int nextRandom = numberGenerator.nextInt(6);
            System.out.println(fruit[nextRandom]);
        }


    }

}
import java.util.Random;
公开课问题A2{
公共静态void main(字符串[]args){
字符串[]水果={“橙色”、“苹果”、“梨”、“班纳纳”、“草莓”、“芒果”};
随机数生成器=新随机数();
对于(int i=0;i<5;i++){
int nextRandom=numberGenerator.nextrant(6);
System.out.println(水果[nextRandom]);
}
}
}

生成随机数时,我建议将其添加到数组中

然后,当你生成下一个数字时,做一些搜索(谷歌搜索一些有效的东西),检查这个数字是否已经在数组中,因此,已经被使用

如果是,生成一个新的,如果不是,使用它

可以通过将其嵌套在while循环中来实现这一点


虽然,从你的问题中我可以看出,你最好使用ArrayList创建一个水果数组的副本,然后,当你生成一个随机数来选择一个水果,简单地把这个水果从这个新的列表中删除,减去你正在生成的随机数的范围。

< P>有很多不同的方法可以考虑,这取决于算法应该是多么的灵活。 从6个元素的列表中选择5个随机元素,与从6个元素的列表中选择1个您未选择的元素相同。这是一个非常不灵活但非常容易的方法

另一种方法是从列表中删除元素,并减少最大随机数。因此,我建议不要使用
字符串[]

fruit.remove(fruit[nextRandom]);

可能是删除子方法吗?

将数组复制到
列表中,然后将其洗牌,然后逐个拾取元素:

List<String> copy = new ArrayList<>(Arrays.asList(fruit));
Collections.shuffle(copy);
for (String f : copy)
    System.out.println(f);
List copy=newarraylist(Arrays.asList(fruit));
收藏。洗牌(复制);
for(字符串f:复制)
系统输出打印ln(f);

如果我理解正确,那么您希望从n个元素的列表中随机选择n-1个元素。如果是,那么我建议随机选择一个,然后选择所有其他的

Arrays.shuffle(fruit);
int notThis = numberGenerator.nextInt(6);
for(int i = 0; i < fruit.length; i++)
    if(i!=notThis) System.out.println(fruit[i]);
array.shuffle(水果);
int notThis=numberGenerator.nextInt(6);
for(int i=0;i
您可以使用
集合
验证随机生成的数字是否重复。您只需不断生成
随机数
,直到找到唯一的随机数,然后将其添加到
集合
,以防止重复

下面是一个快速代码片段:

public static void main(String[] args) {
    String[] fruit = {"orange", "apple", "pear", "bannana", "strawberry", "mango"};
        Random numberGenerator = new Random();
        /* Generate A Random Number */
        int nextRandom = numberGenerator.nextInt(6);
        Set<Integer> validate = new HashSet<>();
        /* Add First Randomly Genrated Number To Set */
        validate.add(nextRandom);
        for (int i = 0; i < 5; i++) {
            /* Generate Randoms Till You Find A Unique Random Number */
            while(validate.contains(nextRandom)) {
                nextRandom = numberGenerator.nextInt(6);
            }
            /* Add Newly Found Random Number To Validate */
            validate.add(nextRandom);
            System.out.println(fruit[nextRandom]);
        }
}

您可以将int包装成“integer”并将其添加到Set中。集合不包含重复项,因此其中只有唯一的值。因此,只需检查集合是否已使用Set.contains(Integer)指定整数。

我的个人解决方案:

private static int[] randomIndexes(int len) {
    int[] indexes = new int[len];
    for (int i = 0; i < len; i++) {
        indexes[i] = i;
    }
    for (int i = len - 1, j, t; i > 0; i--) {
        j = RANDOM.nextInt(i);
        t = indexes[j];
        indexes[j] = indexes[i];
        indexes[i] = t;
    }
    return indexes;
}
私有静态int[]随机索引(int len){
int[]索引=新的int[len];
对于(int i=0;i0;i--){
j=随机。下一个(i);
t=指数[j];
索引[j]=索引[i];
指数[i]=t;
}
收益指标;
}

查看它的实际操作:

我认为使用ArrayList和控制随机数的生成会更容易,如下所示

import java.util.Random;

public class QuestionOneA2 {

      public static void main(String[] args) {

        List<String> fruits = new ArrayList<>();

        fruits.add("orange");
        fruits.add("apple");
        fruits.add("pear");
        fruits.add("bannana");
        fruits.add("strawberry");
        fruits.add("mango");

        Random numberGenerator = new Random();
        int nextRandom;

       for (int i = 0; i < 6 ; i++) {
           nextRandom = numberGenerator.nextInt(6 - i);
           System.out.println(fruits.get(nextRandom));
           fruits.remove(nextRandom);
        }
      }

}
import java.util.Random;
公开课问题A2{
公共静态void main(字符串[]args){
列表结果=新的ArrayList();
水果。添加(“橙色”);
水果。添加(“苹果”);
水果。添加(“梨”);
添加(“班纳纳”);
水果。加入(“草莓”);
水果。添加(“芒果”);
随机数生成器=新随机数();
int nextRandom;
对于(int i=0;i<6;i++){
nextRandom=numberGenerator.nextInt(6-i);
System.out.println(fruits.get(nextRandom));
水果。移除(nextRandom);
}
}
}

所以你想从一组6个项目中随机选择5个项目?应用
Collections.shuffle()
对填充列表进行排序是的,我想从6个项目中随机选择5个,不重复。各位,非常感谢大家的帮助,有没有办法从数组中随机删除一个元素?这可能是执行TaskArray的一种更简单的方法。Array没有
remove
方法。二进制搜索仅在排序arrays@SashaSalauyou没错,不知道我在想什么哈哈!如果他这样做,他可能会一次又一次地得到同样的订单。例如,如果
apple
被排除,则订单将为
OPBSM
;如果
pear
被排除,则订单将为
OABSM
。在这两种情况下,
Orage
的顺序都是固定的,即0。然后先洗牌水果,然后这个问题也会得到解决:数组。在打印结果之前必须添加洗牌(水果)。我将此添加到我的解决方案中是的,
洗牌
就可以了。将其存储在字符串中是我尝试做的一项要求
import java.util.Random;

public class QuestionOneA2 {

      public static void main(String[] args) {

        List<String> fruits = new ArrayList<>();

        fruits.add("orange");
        fruits.add("apple");
        fruits.add("pear");
        fruits.add("bannana");
        fruits.add("strawberry");
        fruits.add("mango");

        Random numberGenerator = new Random();
        int nextRandom;

       for (int i = 0; i < 6 ; i++) {
           nextRandom = numberGenerator.nextInt(6 - i);
           System.out.println(fruits.get(nextRandom));
           fruits.remove(nextRandom);
        }
      }

}