有没有办法用我正在使用的方法生成相同的数字?

时间:2015-03-20 02:34:10

标签: java netbeans

我必须使用2D阵列打印宾果板,而我使用的方法具有逻辑意义,但我似乎无法弄清楚为什么它仍然会生成相同的数字。有什么想法吗?我已经尝试了arraylist,但它是一维数组,如果它有可能是2D的概率,有人可以帮忙。 *****更新了,所以我使用了一些东西,我仍然卡住了。

package bingo.arrays.assignment;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class bingoooooooooooooo {

    public static void main(String[] args) {
        int[][] card = new int[5][5];
        display1(card);

    }

    public static void display1(int[][] card) {
        int[] colm = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

        int v = 1, z = 15;
        int x = 10000;
       List l = new ArrayList();
        for (int i : colm) {
           l.add(i);
       }
        Collections.shuffle(l);
        //do {
        for (int i = 0; i < 5; i++) {

            for (int j = 0; j < 5; j++) {
                boolean numberFound = false;
                while (!numberFound) {
                    int number1 = (int) (Math.random() * z) + v;

                    if (!checkNumber(number1, card, j)) {
                        break;
                    }

                    card[i][j] = number1;
                    System.out.print("|" + card[i][j]);
                }

//                if (card[i][j] > 25) {
//                x++;
//                }
            }

            v = v + 15;
            z = z + 15;
            System.out.println(" ");

        }
        //}while (true);
    }

public static boolean checkNumber(int number, int[][] card, int j) {

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

    if(card[i][a] == number) return false;
  }

  return true;
}






}

2 个答案:

答案 0 :(得分:1)

基本上,您有重叠的范围,数字可以在0zv的范围内。发生的是一个数字是在非常低的范围内产生的,但是v不足以将其移动到超出前一组范围的范围

例如......

z == 130v == 13

(0.289 * 130) + 31 = 68
(0.304 * 130) + 31 = 70
(0.934 * 130) + 31 = 152
(0.85 * 130) + 31 = 141
(0.902 * 130) + 31 = 148

z == 145v == 13

(0.731 * 145) + 46 = 152
(0.672 * 145) + 46 = 143
(0.016 * 145) + 46 = 48
(0.292 * 145) + 46 = 88
(0.35 * 145) + 46 = 96

您可以看到两组中的数字相互重叠。问题只会随着z变得更大而变得更糟,因为它有更多的空间来生成重叠数字。

现在,我确定你可以使用一些非常棒的mathamtical forumal,但我为此懒惰(而且愚蠢),相反,我会使用{某种类型的{1}}生成随机序列的25个数字。这将确保每个值都是唯一的

Set

将打印类似......

的内容
public static void display1(int[][] card) {

    // Create the set
    Set<Integer> numbers = new HashSet<>(5 * 5);
    // Keep looping until we get 25 numbers
    while (numbers.size() < 5 * 5) {
        // Generate a random number
        numbers.add((int)Math.round(Math.random() * 100));
    }
    // This is just because I'm lazy...
    List<Number> listOfNumbers = new ArrayList<>(numbers);
    for (int i = 0; i < 5; i++) {

        for (int j = 0; j < 5; j++) {
            // Assign the value to the array...
            card[i][j] = (int)listOfNumbers.remove(0);
        }

    }

    // Add just for printing...you could do this in the previous loop
    // but I just wanted to keep it clean...
    for (int i = 0; i < card.length; i++) {

        for (int j = 0; j < card[i].length; j++) {
            System.out.printf("|%3d", card[i][j]);
        }
        System.out.println("|");

    }
}

现在,如果你没有附加到阵列,你可以使用类似......

|  0|  2| 71|  9| 74|
| 16| 22| 87| 24| 28|
| 93| 30| 33| 40| 41|
| 42| 49| 50| 51| 52|
| 55| 56| 59| 60| 63|

计算给定行/列的int index = (row * 5 + col); 偏移量index

List

答案 1 :(得分:0)

您的问题似乎只是检查以前的号码。

您需要遍历当前部分中的所有数字,如下所示:

boolean numberFound = false;
while(!numberFound) {
  int number1 = (int) (Math.random() * z) + v;

  if(!checkNumber(number1, card, j)) break;

  card [i][j]=number1;
  System.out.print("|" + card[i][j]);
}

public static boolean checkNumber(int number, int[][] card, int j) {
  for(int a = 0; a <= j; a++) {
    if(card[i][a] == number) return false;
  }

  return true;
}