创建和打印非重复整数数组-Java
我正在尝试编写一个猜测游戏程序,其中随机生成一个4位数的数字。数字必须是唯一的(因为它们在任何时候都不会重复)。我对Java相当陌生,在数组中显示数字时遇到问题。此外,我也无法找到一种方法,将一个数字与其他数字进行多次核对。例:如果随机数A与随机数B相同,它将生成一个新的随机数A。但我不知道如何在不反复写相同代码的情况下检查新的随机数A是否与数字B相同。(显然是某种循环,但我不知道是哪种循环)创建和打印非重复整数数组-Java,java,arrays,loops,testing,random,Java,Arrays,Loops,Testing,Random,我正在尝试编写一个猜测游戏程序,其中随机生成一个4位数的数字。数字必须是唯一的(因为它们在任何时候都不会重复)。我对Java相当陌生,在数组中显示数字时遇到问题。此外,我也无法找到一种方法,将一个数字与其他数字进行多次核对。例:如果随机数A与随机数B相同,它将生成一个新的随机数A。但我不知道如何在不反复写相同代码的情况下检查新的随机数A是否与数字B相同。(显然是某种循环,但我不知道是哪种循环) 您可以首先将随机数添加到java.util.HashSet中,然后将其转换为数组。这样可以消除所有重复
您可以首先将随机数添加到
java.util.HashSet
中,然后将其转换为数组。这样可以消除所有重复项。改用ArrayList怎么样
语法是不同的,但是你可以用循环的方式完成你的程序
例如:
ArrayList<Integer> randNums = new ArrayList();
while(randNums.size() != 4) {
int a = randy.nextInt(9);
if(false == randNums.contains(a))
randNums.add(a);
}
ArrayList randNums=new ArrayList();
while(randNums.size()!=4){
int a=randy.nextInt(9);
if(false==randNums.contains(a))
增加(a);
}
编辑以添加旁注:ArrayList也有您想要的更漂亮的打印。用于生成随机唯一整数 使用
集合
创建唯一值的集合。否则,对于生成的每个随机数,在添加它之前迭代数组以确保它是唯一的
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]);
}
Integer[]createGuesses(整数、整数低、整数高)
{
Set guesses=new HashSet();
Random rand=新的Random();
while(guesss.size()
如果您可以在内存中存储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;
}
}
公共类您的类
{
私有静态int最终大小=10000;
私有int[]数组=新int[SIZE];
私有整数=0;
私有随机=新随机();
公共课
{
对于(int i=0;i如果您想将当前数组类型更改为Integer
而不是int
,那么我建议您选择其他答案之一。我的第一反应是向您展示,如果您使用ArrayList
及其幂函数,然后将其转换为Integer[]
再次无int[]
最后,我决定给你写一个答案,这可能不是最优雅的,也不是最简短的,但它将教会你如何正确思考,然后才能使用工具去除这些元素(ArrayList及其功能,如我们所说)
算法非常简单。
您可以按所需的n
大小创建int数组
从0迭代到n
,每次迭代后:
A.创建一个do while
循环,该循环将生成0-9之间的随机数。
B.从0-9生成一个随机的temp
数字。
C.迭代当前的readArray
以查找生成的号码是否在里面,如果在里面,它将标记该号码并停止查找过程(因为我们发现已经有了该号码)。
D.将检查标志是否存在
设置为true,如果存在,则将再次进入步骤B,否则将进入步骤3
如果在未将标志
更改为true的情况下到达查找(for)的末尾,则临时
(生成的编号)不在当前数组中,可以安全地添加它
将检查是否到达数组的末尾或是否有更多的数组单元格要填充。i
代码:
Random randy=new Random();
int[]readArray=新的int[4];
for(int i=0;i
“//prints gibberish”使用System.out.print(Arrays.toString(randArray))
@John Lapinski:你需要澄清你想要的是唯一的随机数还是随机数中的唯一数字。@Zouzu谢谢!这很容易解决我的第一个问题!另外,Backcompe我想要随机数中的唯一数字。把它分解成数字,因为我认为这样处理比较容易,但不一定必须这样做这不会总是向返回的数组中添加4个不同的值。它们可能是一些null
元素。@zouzu:如果你说createGuesss(numguesss,10009999)
,则不会。null元素?我不懂。假设你想生成3个随机数(numguesss=3
)。现在让我们假设生成的随机数为5、2、5。最后5个不会添加到集合中。因此集合仅包含5和2。当您构建要返回的数组(长度为3)时,数组的最后一个元素将填充一个null
值。因此生成的数组将是[5,2,null]
。最后一行必须是:返回guesses.toArray(新整数[guesses.size()]);
@ZouZou:我明白了。谢谢。
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;
}
}
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));