【问题标题】:How do I generate 6 random numbers between 1 and 6 using Java?如何使用 Java 生成 1 到 6 之间的 6 个随机数?
【发布时间】:2013-04-16 22:41:33
【问题描述】:

我遇到了在 Java 中生成 6 个介于 1 和 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();
    }

【问题讨论】:

  • 1 到 6 之间的 6 个唯一数字不是随机的。他们将永远是 1,2,3,4,5,6。它们的顺序可能是随机的,但不是数字。
  • 如果 kolon=5 在您的示例中为什么是 4 行?
  • 另外,你打电话给Arrays.sort(dizi_asil[i]);。那么为什么你希望你的数组不被排序???
  • 例如:当我运行程序时,有时我得到 1 2 4 5 6 6 。这是错误的,我必须总是得到 1 2 3 4 5 6
  • 您不是要生成 6 个随机数,而是要生成 1 到 6 的随机 排列。尝试Collection.shuffle,正如其他人在他们的答案中指出的那样。

标签: java arrays random numbers prng


【解决方案1】:

进口:

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

【讨论】:

    【解决方案2】:

    一个更短的方法是使用许多人已经提到的随机播放。

    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]
    

    【讨论】:

      【解决方案3】:

      一个非常简单的修复 - 将 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];
      }
      

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

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

      【讨论】:

        【解决方案4】:

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

        迭代列表,每次获取唯一值。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案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.
            

            【讨论】:

            • 例如:当我运行程序时,有时我会得到 1 2 4 5 6 6 。这是错误的,我必须总是得到 1 2 3 4 5 6
            • @user2204772:那就停止使用低效(且有缺陷)的方式,使用我提供的代码 sn-p。
            猜你喜欢
            • 2016-01-18
            • 1970-01-01
            • 2023-03-11
            • 2014-04-30
            • 1970-01-01
            • 1970-01-01
            • 2013-12-21
            • 2014-05-08
            相关资源
            最近更新 更多