随机匹配,无重复

时间:2018-07-10 06:40:45

标签: java arrays random

我在学校从事过该项目,并因出错而卡住了。我无法运行此代码,因为它有一个错误'randA2已在方法main(String[])中定义'如何解决?

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);

3 个答案:

答案 0 :(得分:5)

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

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);

答案 1 :(得分:1)

如果要在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);

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

答案 2 :(得分:0)

您可以在while循环中重新定义变量。 在while循环中忽略let rangeOne = 1...500 let rangeTwo = 501...1000 let array = [] + rangeOne.reversed() + rangeTwo.reversed() // [500, 499, ..., 2, 1, 1000, 999, ..., 502, 501] 声明:

let array = Array(rangeOne.reversed()) + rangeTwo.reversed()
let array = Array([rangeOne.reversed(), rangeTwo.reversed()].joined())
let array = Array(rangeOne.reversed()) + Array(rangeTwo.reversed())
let array = [rangeOne.reversed(), rangeTwo.reversed()].flatMap { $0 }

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