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

时间:2014-01-17 19:51:39

标签: java arrays loops testing random

我正在尝试编写一个猜测游戏程序,其中随机生成一个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);
    }

}

5 个答案:

答案 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及其权力)正如我们所说)。

算法非常简单。

  1. 您可以int-array尺寸创建n
  2. 你将它从0迭代到n并且每次迭代你: A.创建一个do-while循环,从0到9生成一个随机数 B.从0-9生成随机temp个数字。 C.迭代当前readArray查找生成的数字是否在内部,如果是,它将标记它并停止查找过程(因为我们发现我们已经拥有它)。
    D.检查标志isExists是否设置为真,如果是,则再次进入步骤B,否则将进入步骤3.
  3. 如果我们在未将flag更改为true的情况下到达查找结束(for),则temp(生成的数字)不在我们当前的数组中,并且它将是安全的加上它。
  4. 将检查我们是否到达阵列的末尾或者是否有更多阵列单元要填充。 i < readArray.length
  5. 代码:

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