2013-04-23 753 views
3

我遇到了一个问题,在Java中产生6到6之间的随机数。所有的数字必须是唯一的。当我输入kolon值为5时,阵列应该是这样的:如何使用Java在1到6之间生成6个随机数?

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 1和6之间的唯一号码不是随机的。他们将永远是1,2,3,4,5,6。他们的顺序可能是随机的,但不是数字。 – jlordo 2013-04-23 16:03:18

+0

为什么4行如果kolon = 5在你的例子中? – NINCOMPOOP 2013-04-23 16:04:42

+1

另外,你正在调用'Arrays.sort(dizi_asil [i]);'。那么,为什么你期望你的数组不被排序? – jlordo 2013-04-23 16:08:24

回答

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]; 
} 

我也建议the Random class,其中有一个nextInt(int)方法,这是优于(int) ((Math.random() * 6) + 1)

但洗牌可能是一个更快的方法来做到这一点。或者像使用其他答案一样使用API​​,或者查看Fisher-Yates/Knuth shuffle以获得简单的随机播放算法。

+0

非常感谢你,你一直很有帮助 – 2013-04-23 16:46:45

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. 
+0

例如:当我运行程序,某些时候即时获取1 6。这是错误的,我必须始终得到1 2 3 4 5 6 – 2013-04-23 16:24:22

+2

@ user2204772:然后停止使用低效率(和bug)的方式,并使用我提供的代码片段。 – jlordo 2013-04-23 16:26:17

7

创建包含1至6的列表,然后使用Collection.shuffle洗牌它。然后你会得到随机的唯一编号

+1

棘手的答案。 +1 :) – 2013-04-23 16:07:32

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

迭代列表,每次得到的独特价值。

1

一个更简短的方法是使用洗牌,因为许多人已经提到过。

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] 
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++; 
相关问题