我正在尝试编写一个猜测游戏程序,其中随机生成一个4位数字。这些数字必须是唯一的(因为它们在任何时候都不重复)我是Java的新手,我在数组中显示数字时遇到问题。此外,我无法找到一种方法来检查一个数字与其他人不止一次。 EX:如果随机数A与随机数B相同,它将产生一个新的随机数A.但我不知道如何检查新的随机A是否与数字B相同,而不是一遍又一遍地编写相同的代码。 (显然是某种循环,但我不知道哪种循环)
import java.util.Random;
public class Game {
public static void main(String[] args) {
// TODO Auto-generated method stub
int rand1 = 0;
int rand2 = 0;
int rand3 = 0;
int rand4 = 0;
int[] randArray = new int[]{rand1, rand2, rand3, rand4};
Random randy = new Random();
int a = randy.nextInt(9);
int b = randy.nextInt(9);
int c = randy.nextInt(9);
int d = randy.nextInt(9);
//how to check the variable more than one time?
a = rand1;
if (b == a) {
b = randy.nextInt(9);
}
else rand2 = b;
if (c == a || c == b) {
c = randy.nextInt(9);
}
else rand3 = c;
if (d == a || d == b || d == c) {
d = randy.nextInt(9);
}
else rand4 = d;
System.out.print(randArray); //prints gibberish
//prints the numbers fine
//System.out.print(rand1);
//System.out.print(rand2);
//System.out.print(rand3);
//System.out.print(rand4);
}
}
答案 0 :(得分:0)
您可以先将随机数添加到java.util.HashSet
,然后将其转换为数组。这样你就可以摆脱所有重复。
答案 1 :(得分:0)
如何使用ArrayList呢?
语法不同,但您可以循环方式执行程序。
例如:
ArrayList<Integer> randNums = new ArrayList();
while(randNums.size() != 4) {
int a = randy.nextInt(9);
if(false == randNums.contains(a))
randNums.add(a);
}
编辑以添加旁注:ArrayList也具有您正在寻找的更漂亮的打印。
答案 2 :(得分:0)
用于生成随机唯一整数
使用Set
创建唯一值的集合。否则,对于生成的每个随机数,迭代数组以确保它在添加之前是唯一的。
Integer[] createGuesses(int numGuesses, int low, int high)
{
Set<Integer> guesses = new HashSet<>();
Random rand = new Random();
while(guesses.size() < numGuesses)
guesses.add(low + rand.nextInt(high - low));
return guesses.toArray(new Integer[numGuesses]);
}
答案 3 :(得分:0)
如果你可以在内存中存储10000个条目的'int'数组:
public class YourClass
{
private static int final SIZE = 10000;
private int[] array = new int[SIZE];
private int currIteration = 0;
private Random random = new Random();
public YourClass()
{
for (int i=0; i<SIZE; i++)
array[i] = i;
}
public int getRandVal()
{
int index = random.nextInt(SIZE-currIteration);
int val = array[index];
array[index] = array[SIZE-currIteration-1];
array[SIZE-currIteration-1] = val;
if (++currIteration == SIZE)
currIteration = 0;
return val;
}
}
答案 4 :(得分:0)
如果您想将当前数组类型更改为Integer
而不是int
,那么我建议您采取其他答案之一。我的第一直觉是向您展示如果您使用ArrayList<Integer>
及其功能然后将其再次转换为Integer[]
而不是int[]
,那将是多么干净,可读和简单。
最后我决定给你写一个答案,这可能不是最优雅和最狡猾但不是最短的答案,但它会教你如何在你使用可以取消这些元素的工具之前思考(ArrayList及其权力)正如我们所说)。
算法非常简单。
int-array
尺寸创建n
。n
并且每次迭代你:
A.创建一个do-while
循环,从0到9生成一个随机数
B.从0-9生成随机temp
个数字。
C.迭代当前readArray
查找生成的数字是否在内部,如果是,它将标记它并停止查找过程(因为我们发现我们已经拥有它)。isExists
是否设置为真,如果是,则再次进入步骤B,否则将进入步骤3. flag
更改为true的情况下到达查找结束(for),则temp
(生成的数字)不在我们当前的数组中,并且它将是安全的加上它。i < readArray.length
。代码:
Random randy = new Random();
int[] readArray = new int[4];
for (int i = 0; i < readArray.length; i++) {
int temp;
boolean isExists;
do {
isExists = false;
temp = randy.nextInt(10);
for (int j = 0; j < i; j++)
{
if (readArray[j] == temp)
{
isExists = true;
break;
}
}
} while (isExists);
readArray[i] = temp;
}
System.out.println(Arrays.toString(readArray));