创建和打印非重复整数数组-Java

创建和打印非重复整数数组-Java,java,arrays,loops,testing,random,Java,Arrays,Loops,Testing,Random,我正在尝试编写一个猜测游戏程序,其中随机生成一个4位数的数字。数字必须是唯一的(因为它们在任何时候都不会重复)。我对Java相当陌生,在数组中显示数字时遇到问题。此外,我也无法找到一种方法,将一个数字与其他数字进行多次核对。例:如果随机数A与随机数B相同,它将生成一个新的随机数A。但我不知道如何在不反复写相同代码的情况下检查新的随机数A是否与数字B相同。(显然是某种循环,但我不知道是哪种循环) 您可以首先将随机数添加到java.util.HashSet中,然后将其转换为数组。这样可以消除所有重复

我正在尝试编写一个猜测游戏程序,其中随机生成一个4位数的数字。数字必须是唯一的(因为它们在任何时候都不会重复)。我对Java相当陌生,在数组中显示数字时遇到问题。此外,我也无法找到一种方法,将一个数字与其他数字进行多次核对。例:如果随机数A与随机数B相同,它将生成一个新的随机数A。但我不知道如何在不反复写相同代码的情况下检查新的随机数A是否与数字B相同。(显然是某种循环,但我不知道是哪种循环)


您可以首先将随机数添加到
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));