Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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
如何生成6个唯一的java编号_Java - Fatal编程技术网

如何生成6个唯一的java编号

如何生成6个唯一的java编号,java,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];

可能重复:

代码将从一个范围内生成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("     ***");
}
}

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

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

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

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

更好的解决方案是使用集合,但这可能是本阶段的高级主题。

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

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);
更好的解决方案是使用集合,但这可能是本阶段的高级主题。

只需使用集合,感谢@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]);
}
只需使用一套,感谢@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]);
}
您只需使用该方法并在洗牌后返回前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?
}
这种方法的优点是,它以线性时间运行,即洗牌所花费的时间。避免拾取x乘以x可能是一个非常大的元素,并检查它是否已被拾取

您只需使用该方法并在洗牌后返回前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?
}
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("     ***");
}

这种方法的优点是,它以线性时间运行,即洗牌所花费的时间。避免拾取x乘以x可能是一个非常大的元素,并检查它是否已被拾取

我喜欢set方法,但这个例子有点夸张

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("     ***");
}
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;
}

我喜欢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;
}
这样怎么样

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());
    }
  }
}
这样怎么样

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


为什么不简单地检查新数字是否与先前的一个不相同?您没有检查LottonMembers数组以查看新数字是否已经在其中。@Achtyajha它是一个构造函数。为什么不简单地检查新数字是否与先前的一个不相同?您没有检查LottonMembers数组查看新编号是否已在其中。@Achtyajha它是一个构造函数。好的,谢谢!更好的研究循环检查阵列OK谢谢你的帮助伙计@user1946316不客气+1用于展示如何按照要求解决问题,以及如何更好地解决问题。好的,谢谢!更好的研究循环检查阵列OK谢谢你的帮助伙计@user1946316不客气+1用于显示如何按要求解决此问题,以及指示如何更好地解决此问题。您可以通过测试set.size而不是保留生成的计数器来简化此过程。您也不需要i临时变量。最终得到的结果类似于while set.size