4

我遇到了在 Java 中生成 1 到 6 之间的 6 个随机数的问题。所有数字都必须是唯一的。当我输入 kolon 值 5 时,数组应该是这样的:

1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6

我不希望程序生成相同的两个数字。这里有什么问题?

相关代码:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Please enter row quantity: ");

    int kolon = input.nextInt();

    Integer[][] dizi_asil = new Integer[kolon][6];

    for (int i = 0; i < kolon; i++) {
        Integer[] dizi = new Integer[6];

        for (int j = 0; j < 6; j++) { 

            dizi[j] = (int) ((Math.random() * 6) + 1);  

            for (int u = 0; u < 1; u++) { 

                for (int k = 0; k < j; k++) { 

                    while (dizi[k] == dizi[j]) { 
                        dizi[j] = (int) ((Math.random()* 6)  + 1);
                        u++;
                    }

                }
            }
            dizi_asil[i][j] = dizi[j];
        }
        Arrays.sort(dizi_asil[i]);
    }

    for (int i = 0; i < dizi_asil.length; i++) {
        for (int k = 0; k < dizi_asil[i].length; k++) {
            System.out.print(dizi_asil[i][k] + "\t");
        }
        System.out.println();
    }
4

6 回答 6

7

创建一个包含 1 到 6 的列表。然后使用Collection.shuffle对其进行随机播放。然后你会得到随机的唯一号码

于 2013-04-23T16:05:03.150 回答
6

这是一个简单的方法:

List<Integer> list = Arrays.asList(1,2,3,4,5,6);
Collections.shuffle(list);
// you can convert it to an array if you need to.
于 2013-04-23T16:04:24.443 回答
5

一个非常简单的修复 - 替换u++;u--;. ++将使循环停止,--使其继续。

虽然我建议更像下面的东西。我希望它很容易理解。

Integer[] dizi = new Integer[6];

for (int j = 0; j < 6; j++)
{
  boolean isValid;
  do
  {
     dizi[j] = (int) ((Math.random() * 6) + 1);
     isValid = true;
     for (int k = 0; isValid && k < j; k++)
        if (dizi[k] == dizi[j])
           isValid = false;
  }
  while (!isValid);
  dizi_asil[i][j] = dizi[j];
}

我还建议Random 类,它有一个nextInt(int)方法,比(int) ((Math.random() * 6) + 1).

但改组可能是一种更快的方法。要么像其他答案之一一样使用 API,要么查看Fisher-Yates / Knuth shuffle以获得简单的 shuffle 算法。

于 2013-04-23T16:32:20.500 回答
3

尝试Collections.shuffle(list);

List<Integer> list = new ArrayList<Integer>();
for(int i = 1; i<7 ; i++)
    list.add(i);

或者你可以这样做:

List<Integer> list = Arrays.asList(1,2,3,4,5,6)

Collections.shuffle(list);

迭代列表并每次获得唯一值。

于 2013-04-23T16:05:16.823 回答
1

正如许多人已经提到的那样,一种更短的方法是使用 shuffle 。

public static void main(String... ignored) {
    Scanner input = new Scanner(System.in);
    System.out.println("Please enter row quantity: ");

    List<Integer> rolls = Arrays.asList(1, 2, 3, 4, 5, 6);
    for (int i = 0, rows = input.nextInt(); i < rows; i++) {
        Collections.shuffle(rolls);
        System.out.println(rolls);
    }
}

如果你运行它,你会得到类似的东西

Please enter row quantity: 
5
[5, 6, 3, 2, 4, 1]
[5, 4, 3, 6, 2, 1]
[6, 4, 2, 3, 5, 1]
[3, 1, 6, 2, 5, 4]
[4, 1, 6, 3, 5, 2]
于 2013-04-23T18:23:31.833 回答
0

进口:

import acm.util.RandomGenerator;
private RandomGenerator rgen = RandomGenerator.getInstance();

实际采摘:

randnum = rgen.nextInt(1, 6);

这会在 0 到 5 之间选择一个随机数。您可以对 1 到 6 执行此操作:

randnum = rgen.nextInt(2, 7);

或者:

randnum = rgen.nextInt(1, 6);
randnum++;
于 2014-02-20T03:54:54.967 回答