Java 无重复的随机匹配

Java 无重复的随机匹配,java,arrays,random,Java,Arrays,Random,我在学校做过这个项目,但遇到了一个错误。我无法运行此代码,因为它有一个错误“randA2已在方法main(字符串[])中定义”“如何修复它 String [] A = {"Russia", "Saudi_Arabia", "Egypt", "Uruguay"}; int A1 = A.length; int randA1 = (int)(Math.random()*A1); int randA2 = (int)(Math.random()*A1); int randA3 = (int)(Math

我在学校做过这个项目,但遇到了一个错误。我无法运行此代码,因为它有一个错误“
randA2
已在方法
main(字符串[])中定义”
“如何修复它

String [] A = {"Russia", "Saudi_Arabia", "Egypt", "Uruguay"};
int A1 = A.length;
int randA1 = (int)(Math.random()*A1);
int randA2 = (int)(Math.random()*A1);
int randA3 = (int)(Math.random()*A1);
int randA4 = (int)(Math.random()*A1);
while(randA1 == randA2) {
    int randA2 = (int)(Math.random()*A1);
}
while(randA1 == randA3) {
    int randA3 = (int)(Math.random()*A1);
}
while(randA2 == randA3) {
    int randA3 = (int)(Math.random()*A1);
}
while(randA1 == randA4) {
    int randA4 = (int)(Math.random()*A1);
}
while(randA2 == randA4) {
    int randA4 = (int)(Math.random()*A1);
}
while(randA3 == randA4) {
    int randA4 = (int)(Math.random()*A1);
}
String AnnounceA1 = A[randA1] +" " + "VS" + " " + A[randA2];
System.out.println(AnnounceA1);
String AnnounceA2 = A[randA3] +" " + "VS" + " " + A[randA4];
System.out.println(AnnounceA2);

如果要在Java中为变量重新分配新值,则无需再次声明其类型。因此,您的第一个
while
循环应该如下所示:

while (randA1 == randA2) {
    randA2 = (int)(Math.random()*A1);
}
但除此之外,您的代码还有一个逻辑问题,它实际上不会生成4个唯一的随机数。实际上,如果你控制你接受的数字,它们就不是随机的。我会选择这个版本:

String[] teams = { "Russia", "Saudi_Arabia", "Egypt", "Uruguay" };
Set<Integer> rands = new HashSet<>();

while (rands.size() < teams.length) {
    rands.add((int)(Math.random()*teams.length));
}

String AnnounceA1 = teams[rands[0]] +" " + "VS" + " " + teams[rands[1]];
System.out.println(AnnounceA1);
String AnnounceA2 = teams[rands[2]] +" " + "VS" + " " + teams[rands[3]];
System.out.println(AnnounceA2);
String[]团队={“俄罗斯”、“沙特阿拉伯”、“埃及”、“乌拉圭”};
Set rands=new HashSet();
while(rands.size()

我建议的代码版本中的策略是使用一个集合来保存4个随机整数(这是示例中的团队数量)。集合的一个属性是,每个条目都必须是唯一的。所以,如果我们迭代这个集合,添加随机整数,我们最终会得到4个唯一的随机整数。然后,我们可以使用它们来选择要显示在输出消息中的团队名称。

如果要在Java中为变量重新分配新值,则无需再次声明其类型。因此,您的第一个
while
循环应该如下所示:

while (randA1 == randA2) {
    randA2 = (int)(Math.random()*A1);
}
但除此之外,您的代码还有一个逻辑问题,它实际上不会生成4个唯一的随机数。实际上,如果你控制你接受的数字,它们就不是随机的。我会选择这个版本:

String[] teams = { "Russia", "Saudi_Arabia", "Egypt", "Uruguay" };
Set<Integer> rands = new HashSet<>();

while (rands.size() < teams.length) {
    rands.add((int)(Math.random()*teams.length));
}

String AnnounceA1 = teams[rands[0]] +" " + "VS" + " " + teams[rands[1]];
System.out.println(AnnounceA1);
String AnnounceA2 = teams[rands[2]] +" " + "VS" + " " + teams[rands[3]];
System.out.println(AnnounceA2);
String[]团队={“俄罗斯”、“沙特阿拉伯”、“埃及”、“乌拉圭”};
Set rands=new HashSet();
while(rands.size()

我建议的代码版本中的策略是使用一个集合来保存4个随机整数(这是示例中的团队数量)。集合的一个属性是,每个条目都必须是唯一的。所以,如果我们迭代这个集合,添加随机整数,我们最终会得到4个唯一的随机整数。然后,我们可以使用它们来选择要显示在输出消息中的团队名称。

您可以在while循环中重新定义变量。 Ommit
int
声明在while循环中:

...
while(randA1 == randA2) {
    randA2 = (int)(Math.random()*A1);
}
while(randA1 == randA3) {
    randA3 = (int)(Math.random()*A1);
}
...

Java是一种类型安全语言。这与例如JavaScript不同。在JavaScipt内部,JIT(即时编译器)不会抱怨,因为如果类型发生变化,它可以重新定义变量、事件。

您可以在while循环中重新定义变量。 Ommit
int
声明在while循环中:

...
while(randA1 == randA2) {
    randA2 = (int)(Math.random()*A1);
}
while(randA1 == randA3) {
    randA3 = (int)(Math.random()*A1);
}
...

Java是一种类型安全语言。这与例如JavaScript不同。在JavaScipt内部,JIT(即时编译器)不会抱怨,因为它允许在类型发生变化时重新定义变量、事件。

我想用另一种方法来解决您的问题,您只需要:

String[] contries = {"Russia", "Saudi_Arabia", "Egypt", "Uruguay"};
Collections.shuffle(Arrays.asList(contries));

String announceA1 = contries[0] + " VS  " + contries[1];
System.out.println(announceA1);
String announceA2 = contries[2] + " VS  " + contries[3];
System.out.println(announceA2);

我想用另一种方法来解决您的问题,您只需要:

String[] contries = {"Russia", "Saudi_Arabia", "Egypt", "Uruguay"};
Collections.shuffle(Arrays.asList(contries));

String announceA1 = contries[0] + " VS  " + contries[1];
System.out.println(announceA1);
String announceA2 = contries[2] + " VS  " + contries[3];
System.out.println(announceA2);

不要在第一次声明后使用类型,它应该是
randA2=(int)(Math.random()*A1)并且只是为了记录:不使用随机索引,使用一些库方法随机洗牌数组要容易得多。您的代码可以工作,但基本上是为了增强而中断的。每次要向数组中添加另一个字符串时。。。此类检查的数量成倍增加。这是不可伸缩的。如果确实如此,那么您应该将随机索引放在第二个数组中,然后确保第二个数组只有唯一的条目(然后您可以根据需要增加数组,而无需编写更多代码),这也存在逻辑问题。例如,
while(randA2==randA3){int randA3=(int)(Math.random()*A1);}
randA1和randA3可以再次相等…不要在第一次声明后使用类型,它应该是
randA2=(int)(Math.random()*A1)并且只是为了记录:不使用随机索引,使用一些库方法随机洗牌数组要容易得多。您的代码可以工作,但基本上是为了增强而中断的。每次要向数组中添加另一个字符串时。。。此类检查的数量成倍增加。这是不可伸缩的。如果确实如此,那么您应该将随机索引放在第二个数组中,然后确保第二个数组只有唯一的条目(然后您可以根据需要增加数组,而无需编写更多代码),这也存在逻辑问题。例如,
while(randA2==randA3){int randA3=(int)(Math.random()*A1);}
randA1和randA3可以再次相等…@YCF_L还有比这更大的问题。在2分钟内更新。您能快速扩展第二个版本的实际功能吗?对于Java新手来说,可能很难理解为什么会有
while
循环,以及
Set
的作用(以及为什么它能解决4个唯一随机值的问题)@Ben现在更新。@YCF\L还有比这更大的问题。在2分钟内更新。您能快速扩展第二个版本的实际功能吗?对于Java新手来说,可能很难理解为什么会有
while
循环,以及
Set
的作用(以及为什么它解决了4个唯一随机值的问题)@Ben现在更新。这是一个好的选择,但唯一的问题是它会洗牌原始数组,这可能是OP不想要的,但无论如何+1。另一个+1用于使用合理的命名!也许你也会对此做出明确的评论<代码>A