生成不在数组中的随机数

时间:2015-11-30 00:23:01

标签: java arrays

所以我有这个基本上从文本文件中读取的代码。文本文件包含9行9个随机数,以及9列 - 它用于9 x 9数独谜题,所以想一想。

以下是正在读取的文本文件:

1,1,0,0,1,0,0,0,0
1,0,0,1,1,1,0,0,0
0,1,1,0,0,0,0,1,0
1,0,0,0,1,0,0,0,1
1,0,0,1,0,1,0,0,1
1,0,0,0,1,0,0,0,1
0,1,0,0,0,0,1,1,0
0,0,0,1,1,1,0,0,1
0,0,0,0,1,0,0,1,1

对于此特定方面,文件中的值用于确定单元格是否为空。如果它是数字1,那么该单元格将包含某种值,但如果该数字为0,则该单元格为空,并且需要为其生成随机数。

如何使用当Math.random用于生成所述随机数时,它会检查该行中是否已存在相同的数字,如果是,则生成一个新数字?

这是代码。提前谢谢......

import java.util.*;
import java.io.*;
import java.math.*;

public class RandomNumberGenerator {

// set Sudoku value rows to unchangeable number 9
private static final int ROWS = 9;
// set columns to unchangeable number 9
private static final int COLUMNS = 9;

public static void main(String[] args) { // main

    // load in text file
    ReadSudokuFile puzzle = new ReadSudokuFile("puzzle.txt");
    // set array to get number values from getDisplayValues method
    int puzzleNumbers[][] = puzzle.getDisplayValues();

        // rows loop
        for (int rows = 0; rows < ROWS; rows++) {
            // columns loop
            for (int columns = 0; columns < COLUMNS; columns++) {
                // A cell containing the number 0 is an empty input box in Sudoku grid
                if (puzzleNumbers[rows][columns] == 0) {
                    // populate that empty input box to a random number between 1 and 9
                    puzzleNumbers[rows][columns] = (int)((Math.random() * 9) + 1);  // cast Math.random as an int & add 1 so a zero doesn't display
                }
            } // end columns loop
            // print out the array to console
            System.out.println(Arrays.toString(puzzleNumbers[rows]));
        } // end rows loop

    } // end main

}

此文件从另一个文件中提取信息,但此处与此特定问题无关。再次感谢!

3 个答案:

答案 0 :(得分:0)

你可以制作一个检查它的私有方法。

 public boolean checkRow(int row,int generatedNum){

        boolean flag = true;
        for (int columns = 0; columns < COLUMNS; columns++) {
                // A cell containing the number 0 is an empty input box in Sudoku grid
                if (puzzleNumbers[row][columns] == generatedNum) {
               flag = false;
               break;
                }
            }
    }

答案 1 :(得分:0)

您可以使用1到9之间的数字填充ArrayList并获取随机索引。当你需要重新开始时,你可以重置ArrayList。

public class Test {

    public static void main(String[] args) {
        final ArrayList<Integer> numbers = new ArrayList<>();

        // Populate the ArrayList with numbers ( from 1 to 9 )
        resetNumbers(numbers);

        // Getting 5 random numbers from 1 to 9
        for (int i = 0; i < 5; i++) {
            System.out.println(getRandomIndex(numbers));
        }

        // Reset the number list
        resetNumbers(numbers);
        System.out.println();

        // Get another 9 random numbers from 1 to 9
        for (int i = 0; i < 9; i++) {
            System.out.println(getRandomIndex(numbers));
        }
    }

    public static void resetNumbers(ArrayList<Integer> list) {
        list.clear();

        populateList(list, 1, 9);
    }

    public static void populateList(ArrayList<Integer> list, int from, int to) {
        for (int i = from; i <= to; i++) {
            list.add(i);
        }
    }

    public static int getRandomIndex(ArrayList<Integer> numbers) {
        int index = (int)((Math.random() * numbers.size()) + 0);
        int result = numbers.get(index);

        numbers.remove(index);

        return result;
    }
}

答案 2 :(得分:0)

使用Java 8的一种可能方法是从随机数流中过滤行的成员。类似的东西:

Random rand = new Random();
puzzleNumbers[row][col] = rand.ints(0, 10)
    .filter(n -> Arrays.binarySearch(puzzleNumbers[row], 0, col, n) < 0)
    .findAny().get();

为清晰起见,我遗漏了rowcol次迭代。

这可以很容易地扩展,以过滤行或3x3单元格中的数字。如果你想要那些例子,请在评论中告诉我。