我正在尝试在 java 中构建一个程序,用户插入一个值,并且数字达到该值,种子用于伪随机化值表。例如,如果用户输入 5,程序会创建一个 5x5 的表格,其中包含每个数字,直到有一个重复,例如
在此之后,表格应该被提示用户输入的另一个值伪随机化。我的问题是随机化的值不正确,如下图所示,数字范围为 1-5。当用户输入 5,并由 22 的种子值伪随机化时。有人可以帮忙吗?谢谢。
这是我的代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class LabProgram {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
System.out.println("Please enter the number of elements to be paired.");
int input = scnr.nextInt();
// Initialize a 1D Array
int i = 0;
// Append duplicates of pair values 1-input
List<Integer> pairs = new ArrayList<>();
for (i = 1; i <= input; i++) {
// Adds value twice to the array
pairs.add(i);
pairs.add(i);
}
// Prints pairs into a table and creates a new line every fifth value
int count = pairs.size();
int newLine = 0;
for (i = 0; i < count; i++) {
int pair = pairs.get(i);
System.out.printf("%4d", pair);
System.out.print("");
newLine = newLine + 1;
if (newLine == 5) {
System.out.println("");
// Reset lineCount back to 0 to allow for new calc to occur
newLine = 0;
}
}
System.out.println();
System.out.println("Please enter a seed number for testing purposes.\n");
int seed = scnr.nextInt();
// Collections.shuffle(pairs, new java.util.Random(seed));
Random randomGeneratorName = new Random(seed);
// Print the pairs in a table with a max of 5 numbers per row
count = pairs.size();
newLine = 0;
int[] usedNumbers = new int[input];
int unusedNumbers = input * 2;
for (i = 0; i < count; i++) {
int index = pairs.get(i) - 1; // change index to start at 0
int number = index + 1; // change number to start at 1
if (usedNumbers[index] == 0) {
System.out.printf("%4d", number);
usedNumbers[index] = 1;
unusedNumbers--;
newLine++;
if (newLine == 5) {
System.out.println();
newLine = 0;
}
}
}
System.out.println();
}
}
你已经非常接近解决方案了。下面一行是关键,需要取消注释:
Collections.shuffle(pairs, new java.util.Random(seed));
您不需要在最终循环中使用
index
和 number
,您可以简单地使用与第一次完全相同的循环结构,因为 Collections.shuffle
为我们完成了所有工作。使用您的代码,工作的最终循环可能看起来像这样:
Collections.shuffle(pairs, new java.util.Random(seed));
// Print the pairs in a table with a max of 5 numbers per row
newLine = 0;
for (i = 0; i < count; i++) {
int pair = pairs.get(i);
System.out.printf("%4d", pair);
System.out.print("");
newLine = newLine + 1;
if (newLine == 5) {
System.out.println("");
// Reset lineCount back to 0 to allow for new calc to occur
newLine = 0;
}
}
所以有了这个输入:
5
22
我得到以下输出:
Please enter the number of elements to be paired.
5
1 1 2 2 3
3 4 4 5 5
Please enter a seed number for testing purposes.
22
1 4 1 5 3
2 3 5 4 2