【问题标题】:Random element generation without duplicates Java [duplicate]没有重复的随机元素生成Java [重复]
【发布时间】:2016-05-15 14:53:10
【问题描述】:

我正在尝试让此代码在没有重复的情况下运行,但在研究该领域时没有成功。

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

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]);
        }


    }

}

【问题讨论】:

  • 所以你想从 6 个项目中随机选择 5 个项目?
  • Collections.shuffle() 应用于序列填充列表
  • 是的,我正在尝试从 6 个中随机选择 5 个而不重复
  • 大家好,非常感谢大家的帮助,有没有办法让我随机从数组中遗漏一个元素?这可能是执行任务的一种更简单的方法

标签: java arrays duplicates


【解决方案1】:

您可以考虑多种不同的方法,具体取决于算法的灵活性。

从 6 个列表中随机抽取 5 个元素,与从 6 个列表中选择 1 个您未选择的元素相同。这是一个很不灵活,但很容易。

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

【讨论】:

  • 将其存储在字符串中是我尝试做的要求之一
【解决方案2】:

当你生成一个随机数时,我建议将它添加到一个数组中。

然后,当您生成下一个数字时,进行某种搜索(谷歌搜索有效的东西)以检查该数字是否已经在数组中,因此是否已经被使用。

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

您可以通过将其嵌套在 while 循环中来做到这一点。

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

【讨论】:

  • 二分查找仅适用于排序数组
  • @SashaSalauyou 对,不知道我在想什么哈哈!
【解决方案3】:

您可以使用Set 来验证随机生成的数字是否重复。您只需要不断生成randomNumber,直到找到唯一的随机数,然后将其添加到Set 以防止重复。

这是一个快速代码sn-p:

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]);
        }
}

输出:

mango
apple
strawberry
pear
orange

【讨论】:

    【解决方案4】:

    您可以将 int 包装成 'Interger' 并将其添加到 Set。 Set 不包含重复项,因此其中只有唯一值。因此,只需使用 Set.contains(Integer) 检查 Set 是否已经给出了 Integer。

    【讨论】:

      【解决方案5】:

      我的个人解决方案:

      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;
      }
      

      查看实际操作:https://gist.github.com/GautierLevert/a6881cff798e5f53b3fb

      【讨论】:

        【解决方案6】:

        如果我理解正确,那么您想从 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]);
        

        【讨论】:

        • 如果他这样做,那么他最终可能会一次又一次地得到相同的订单。例如,如果apple 被排除在外,那么订单将是OPBSM,如果pear 被排除在外,那么订单将是OABSM。在这两种情况下,Orage 的顺序都是固定的,即 0。
        • 然后先打乱水果,然后这个问题也解决了:必须在打印结果之前添加 Arrays.shuffle(fruits)。我将此添加到我的解决方案中
        • 是的,shuffling 会这样做。
        【解决方案7】:

        将你的数组复制到List&lt;String&gt;,然后随机播放,然后一一挑选元素:

        List<String> copy = new ArrayList<>(Arrays.asList(fruit));
        Collections.shuffle(copy);
        for (String f : copy)
            System.out.println(f);
        

        【讨论】:

          【解决方案8】:

          我认为使用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);
                  }
                }
          
          }
          

          【讨论】:

            【解决方案9】:
            fruit.remove(fruit[nextRandom]);
            

            也许,是remove子方法吗?

            【讨论】:

            • 数组没有remove 方法。
            猜你喜欢
            • 2016-03-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多