【问题标题】:how to generate 6 unique java numbers [duplicate]如何生成6个唯一的Java编号[重复]
【发布时间】:2013-01-04 14:15:20
【问题描述】:

可能重复:
Generating Unique Random Numbers in Java

代码将从一个范围内生成 6 个随机数,但需要它们是唯一的,我的大脑正在融化,任何指针将不胜感激

import java.util.Random;
import java.util.Arrays;
public class numbers
{
private int[] lottoNumbers;
private int nextInt;
private Random r;

public numbers()
{
    lottoNumbers = new int [6];
    r = new Random();
    nextInt();
}
public void nextInt()
{
    System.out.print("***     ");
    for (int i = 0; i < lottoNumbers.length; i++)
    {
        lottoNumbers[i] = r.nextInt(49) +1;
        System.out.print(" " + lottoNumbers[i]);
    }
    System.out.println("     ***");
}
}

【问题讨论】:

  • 您为什么不简单地检查一下新号码与以前的号码之一不同?
  • 您没有检查您的 lottoNumbers 数组以查看新号码是否已经存在。
  • @AchintyaJha 这是一个构造函数。

标签: java


【解决方案1】:

对于这六个数字中的每一个,您都需要将其与已经生成的数字进行比较。如果与其中任何一个相同,则需要继续尝试。

【讨论】:

    【解决方案2】:

    您可以简单地使用shuffle 方法并在洗牌后返回前6个元素:

    // Create the list of possible numbers
    List<Integer> numbers = new ArrayList<Integer>(50);
    for(int i = 1 ; i <= 50 ; ++i) {
        numbers.add(i); 
    }
    // Shuffle the list
    Collections.shuffle(numbers);
    
    // Print the numbers
    int count = 0;
    for(int number : numbers) {
        System.out.println("Random number " + count + ": " + number);
        ++count; // break if count == 6?
    }
    

    这种方法的优点是它以线性时间(shuffle 所用的时间)运行。您避免选择 x 次(x 可能非常大)一个元素并检查它是否已被选择!

    【讨论】:

    • 值得记住的是,线性同余随机数生成器在重复之前永远不会两次生成相同的数字 - 并且它被设计为在循环之前有很长的周期。
    • 这并不真正相关。如果您需要从第一个 Integer.MAX_VALUE 整数列表中选择 Integer.MAX_VALUE / 2 怎么办?随机挑选可能需要很长时间。
    • 为什么比将所有Integer.MAX_VALUE 值放入一个列表并对其进行洗牌需要更长的时间?您的回答表明您遇到的性能问题是您可能会多次随机选择(并因此丢弃)相同的数字。我要指出的是,除非您尝试生成比 RNG 周期更多的数字,否则您不会产生任何冲突(至少如果 RNG 是 LCG)。
    【解决方案3】:

    您需要添加一个循环来检查您已添加的项目中是否存在数字。定义一个boolean 变量,将其设置为false,然后通过循环将现有数字与新生成的数字进行比较。如果您看到重复,请将boolean 设置为true。循环结束后,检查您的 boolean 以查看是否必须添加新号码。

    int i = 0;
    do {
        int next = r.nextInt(49) + 1;
        boolean seen = false;
        for (int j = 0 ; j != i ; j++) {
            if (lottoNumbers[j] == next) {
                seen = true;
                break;
            }
        }
        if (!seen) {
            lottoNumbers[i++] = next;
            System.out.print(" " + next);
        }
    } while (i != lottoNumbers.length);
    

    更好的解决方案是使用Set&lt;Integer&gt;,但这可能是现阶段的高级主题。

    【讨论】:

    • 好的,谢谢!更好的研究循环来检查数组
    • 好的,谢谢你的帮助!
    • @user1946316 不客气!
    • +1 用于展示如何按要求解决问题并指出如何做得更好。
    【解决方案4】:

    只需使用Set(感谢@dty 的改进版!):

    private static final Random RND = new Random();
    private static final int COUNT = 6;
    
    public int[] getRandomNumbers()
    {
        final Set<Integer> set = new HashSet<Integer>(COUNT);
    
        /*
         * This works: .add() will not add the same element twice. As such, we just
         * need to check that the set has the expected size.
         */
        while (set.size() < COUNT)
            set.add(RND.nextInt());
    
        return set.toArray(new int[COUNT]);
    }
    

    【讨论】:

    • 您可以通过测试set.size() 而不是保留generated 计数器来简化此操作。而且您也不需要i 临时变量。你最终会得到类似while (set.size() &lt; COUNT) { set.add(RND.nextInt()); }
    【解决方案5】:

    我喜欢 set 方法,但是这个例子可以稍微简化一下

    private static final Random RND = new Random();
    
    public static Set<Integer> getRandomNumbers(int count) {
        final Set<Integer> set = new HashSet<>(count);
        while (set.size() < count) {
          set.add(RND.nextInt());
        }
        return set;
    }
    

    【讨论】:

      【解决方案6】:
      public void nextInt()
      {
          System.out.print("***     ");
          for (int i = 0; i < lottoNumbers.length; i++)
          {
              int temp;
      
              // check random int doesn't already exist (embedded assignment below)           
              // NOTE: while loop has empty body, note {} in line below
              while (Arrays.asList(lottoNumbers).contains(temp = r.nextInt(49)+1)){}
      
              lottoNumbers[i] = temp;
              System.out.print(" " + lottoNumbers[i]);
          }
          System.out.println("     ***");
      }
      

      【讨论】:

        【解决方案7】:

        这样怎么样?

        package rabdomnumbers;
        
            import java.util.ArrayList;
            import java.util.List;
        
            public class RabdomNumbers {
            public static int SIZE = 6;
        
              public static void main(String[] args) {
                Number[] numbers = new Number[SIZE];
                // set an array
            for (int x = 0; x < SIZE; x++) {
              numbers[x] = new Number();
            }
            // sort an array
            for (int x = 0; x < SIZE-1; x++) {
              for (int y = x + 1; y < SIZE; y++) {
                if (numbers[x].getNumber() > numbers[y].getNumber()) {
                  Number buf = numbers[x];
                  numbers[x] = numbers[y];
                  numbers[y] = buf;
                }
              }
            }
            // print an array
            for (int x = 0; x < SIZE; x++) {
              System.out.println("" + numbers[x].getIndex());
            }
          }
        }
        

        其中 Number 是一个简单的类:

        package rabdomnumbers;
        
        import java.util.Random;
        
        public class Number {
          private int index = 0;
          private int number = 0;
          private static int count = 0;
          private final static Random RND = new Random();
        
          public int getIndex() {
            return index;
          } 
        
          public int getNumber() {
            return number;
          }
        
          public Number() {
            index = count++;
            number = RND.nextInt();
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-24
          • 2017-04-06
          • 2011-09-25
          • 1970-01-01
          • 2017-11-07
          • 1970-01-01
          • 1970-01-01
          • 2012-04-05
          • 1970-01-01
          相关资源
          最近更新 更多