我试图从1到40获取密码,而不是重复任何数字。我如何比较每一个而不是重复?
我已经广泛浏览了Java文档并询问了我的讲座,但我找不到合适的答案。我理解这个概念,我的意思是做什么,但只是不能正确编码。
这是我的代码:
public static void main(String[] args) {
int[] secret = new int[5];
//int[] secret = {0,0,0,0,0};
int[][] num = new int[3][5];
int correctL1 = 0;
int correctL2 = 0;
int correctL3 = 0;
for (int i = 0; i<5; i++){ // to get secret numbers.
secret[i] = (int) ((Math.random() * (40 - 1)) + 1);
}
System.out.println(Arrays.toString(secret));
}
我已经尝试将其放入循环中以获取另一个数字,但它仍然给我重复。
if(((secret[i] == secret[0]) || (secret[i] == secret[1]) ||
(secret[i] == secret[2]) || (secret[i] == secret[3]) ||
(secret[i] == secret[4])) || (secret[i] != 0)) {
secret[i] = ((int) ((Math.random() * (40 - 1)) + 1));
}
答案 0 :(得分:3)
在Java 8中,您可以使用Random#ints
轻松生成一系列不同的随机数:
int[] secret = new Random().ints(1, 40).distinct().limit(5).toArray();
否则,您可以使用Set<Integer>
循环生成while
:
Set<Integer> secret = new HashSet<>();
Random gen = new Random();
while (secret.size() < 5) {
secret.add(gen.nextInt(40 - 1) + 1);
}
答案 1 :(得分:3)
只要生成的数字是生成数字的一部分,只需使用Set<Integer>
保留已生成的数字并进行迭代。
Set<Integer> existing = new HashSet<>();
for (int i = 0; i<5; i++){ // to get secret numbers.
// Loop until the generated number is not part of the already generated numbers
int value;
do {
value = (int) ((Math.random() * (40 - 1)) + 1);
} while (!existing.add(value));
secret[i] = value;
}
答案 2 :(得分:2)
为什么不创建Set<Integer>
(这样你就不会重复)并迭代直到它的大小为5?
答案 3 :(得分:0)
只需使用Set Collection ..为了获得更好的性能,您可以使用下面的代码
Set<Integer> data=new HashSet<Integer>();
如果要按升序获取所有元素,可以使用TreeSet
OR其他逻辑是每个集合都包含返回布尔值的方法,例如data.contains(o)
答案 4 :(得分:0)
while(true){
int[] secret = new int[5];
for (int i = 0; i < 5; i++) { // to get secret numbers.
secret[i] = (int) ((Math.random() * (40 - 1)) + 1);
}
System.out.println("Array:" + Arrays.toString(secret));
Set<Integer> mySet = new HashSet<Integer>();
for (int i = 0; i < 5; i++) { // to get secret numbers.
mySet.add(secret[i]);
}
if (mySet.size() == secret.length) {
System.out.println("OK");
break;
} else {
System.out.println("Not ok");
}
}