Ert*_*tin 3 java arrays random numbers prng
我遇到一个问题,在Java中生成1到6之间的6个随机数.所有数字都必须是唯一的.当我输入kolon值5时,数组应该是这样的:
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
我不希望程序生成相同的两个数字.这有什么不对?
相关代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的方法:
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.
Run Code Online (Sandbox Code Playgroud)
一个非常简单的修复 - 替换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];
}
Run Code Online (Sandbox Code Playgroud)
我还建议使用Random类,它有一个nextInt(int)比一个方法更好的方法(int) ((Math.random() * 6) + 1).
但改组可能是一种更快捷的方式.要么像其他答案一样使用API,要么调查Fisher-Yates/Knuth shuffle以获得简单的随机算法.