所以我有这个基本上从文本文件中读取的代码。文本文件包含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
}
此文件从另一个文件中提取信息,但此处与此特定问题无关。再次感谢!
答案 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();
为清晰起见,我遗漏了row
和col
次迭代。
这可以很容易地扩展,以过滤行或3x3单元格中的数字。如果你想要那些例子,请在评论中告诉我。