【问题标题】:Arrays and random value数组和随机值
【发布时间】:2023-04-03 04:25:01
【问题描述】:

我对随机数和数组有疑问。我有一个列表空列表,我想添加 8 个随机值,但我不希望某些值是相同的。为了获得一些随机值,我使用以下代码:

        for (int i = 0; i < 8; i++) {
            round = random.nextInt(31);
            while (temp.get(round).equals(mix)) {
                round = random.nextInt(31);
            }
            mix.add(temp.get(round));
        }

temp 是包含 32 个对象的列表,mix 是我想要添加 8 个随机值的列表。但是当我随机一些值时,有时我会得到相同的值。如何获取随机值但不重复?

【问题讨论】:

  • 您可以将您的数组转换为一个列表,并使用 arraylist 的 contains 方法来检查它是否存在。如果没有,请添加它。否则,生成一个新的并重试。可以通过 Arrays.asList() 转换为列表(如果您使用的是 Java 6)
  • Unique random numbers in O(1)? 的可能重复项

标签: java random


【解决方案1】:

您可以使用随机列表,该列表基本上维护所有可能值的列表,并在返回给您时删除一个。这通常被称为 Fisher-Yates shuffle。

从列表中删除返回的项目可以防止重复返回相同的数字,您可以查看更多详细信息,以及 Java 实现,here

【讨论】:

    【解决方案2】:

    制作一个包含 32 个对象的集合,将它们随机排列,然后取出前 8 个。

    List <Integer> list = new ArrayList <Integer> ();       
    for (int i = 0; i < 32; ++i)
    {
        list.add (i);
    }
    Collections.shuffle (list);
    

    【讨论】:

      【解决方案3】:

      虽然其他人已经描述了实施新解决方案的方法,但我认为您可以通过更改一行来解决您的问题:

      while (temp.get(round).equals(mix))
      

      我猜这个条件应该是检查temp在位置round的元素是否已经在mix中。应该这样做:

      while (mix.contains(temp.get(round))
      

      第一行的问题是equals被定义为将一个对象与任何其他类型的对象进行比较,因此将temp的一个元素(可能不是集合本身)与mix进行比较,这是。因此,条件始终为假。 Collection.contains是使用方法,需要使用mix之一。 (正如其他人也指出的那样,Set 最适合经常应用 contains 的情况,但对于 8 种情况,根据您的需要,mix 是否是 List 并不重要)。

      [编辑]:顺便说一句:由于random.nextInt(int) 的上限被排除在外,因此如果您使用nextInt(32),您应该只在mix 中获得32 大小temp 的最后一个元素。

      【讨论】:

        【解决方案4】:

        您可以将您的号码添加到Set。继续添加项目,直到您的集合具有正确数量的项目。

        while (set.size() < n)
        {
            int item = random.nextInt(m);
            set.add(item);
        }
        

        请注意,这可能在大多数情况下都可以正常运行。但是,如果n 很大而m - n 很小,它的性能就会很差。

        【讨论】:

          【解决方案5】:

          使用集合。设置您的随机值,直到其大小等于您预定义的数字(例如 8):

          Random random = new Random(System.currentTimeMillis());
          Set<Integer> randomSet = new HashSet<Integer>();
          while(randomSet.size() < 8) {
              randomSet.add(random.nextInt(31));
          }
          // now random set contains 8 different random numbers. 
          

          【讨论】:

            【解决方案6】:
                    int randomCounter = 31;
            
                    for (int i = 0; i < 8; i++) {
                    round = random.nextInt(randomCounter);
                    int roundInTemp = temp.get(round);
                    mix.add(rountInTemp);
                    temp.remove(roundInTemp);
                    randomCounter--;
                }
            

            另一种方法是随机播放临时列表(使用您认为可以的算法)并使用list.sublist(0, 8)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-12-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-25
              • 1970-01-01
              • 2019-05-08
              相关资源
              最近更新 更多