Java中的非重复随机整数

时间:2014-09-10 01:05:10

标签: java random integer

我试图让一小段java代码以随机顺序吐出数字1-6而不重复。我已经设法让它在一到六之间吐出六个随机整数,但它只检查一个数字是否被使用过一次。这是代码:

import java.util.Random;

public class kirbyInt

{

    public static void main(String[] args)
    {
        int num1, num2, num3, num4, num5, num6;


        Random rand = new Random();

        num1 = rand.nextInt((6-1) + 1) + 1;
        System.out.println(num1);

        num2 = rand.nextInt((6-1) + 1) + 1;

        if (num2 == num1)
        {
            num2 = rand.nextInt((6-1) + 1) + 1;
            System.out.println(num2);
        }
        else
        {
            System.out.println(num2);
        }

        num3 = rand.nextInt((6-1) + 1) + 1;

        if (num3 == num1 || num3 == num2)
        {
            num3 = rand.nextInt((6-1) + 1) + 1;
            System.out.println(num3);
        }
        else
        {
            System.out.println(num3);
        } 

        num4 = rand.nextInt((6-1) + 1) + 1;

        if (num4 == num1 || num4 == num2 || num4 == num3)
        {
            num4 = rand.nextInt((6-1) + 1) + 1;
            System.out.println(num4);
        }
        else
        {
            System.out.println(num4);
        } 

        num5 = rand.nextInt((6-1) + 1) + 1;
        if (num5 == num1 || num5 == num2 || num5 == num3 || num5 == num4)
        {
            num5 = rand.nextInt((6-1) + 1) + 1;
            System.out.println(num5);
        }
        else
        {
            System.out.println(num5);
        } 

        num6 = rand.nextInt((6-1) + 1) + 1;
        if (num6 == num1 || num6 == num2 || num6 == num3 || num6 == num4 || num6 == num5)
        {
            num6 = rand.nextInt((6-1) + 1) + 1;
            System.out.println(num6);
        }
        else
        {
            System.out.println(num6);
        } 

    }

}

4 个答案:

答案 0 :(得分:1)

您可以将数字放在ArrayList中。然后得到0-5之间的随机数并打印,然后从ArrayList中删除该位置的数字。这将只留下5个数字,得到0-4之间的下一个随机数,打印并删除该随机索引处的数字,依此类推,直到你只有一个并打印出那个。

答案 1 :(得分:1)

有一种更简单的方法可以解决这个问题。让我们重申你想要做的事情。

问题

您想要创建n个随机数,其中给定数字k不在之前的k-1数字中

解决方案

创建一个用于保留随机数的Set,当您创建一个新的时,将其添加到该集中,当且仅当它不在Set中时,否则生成一个新的随机数,重复。

代码示例

import java.lang.String;
import java.util.Random;
import java.util.Set;
import java.util.HashSet;

public class RandomNum {

    public static final void main(String[] args){
        final Random r = new Random();
        final Set<Integer> s = new HashSet<>();
        for(int i = 0; i < 6; i++){
                while(true) {
                int num = r.nextInt(6) + 1;
                if (s.contains(num) == false) {
                    s.add(num);
                    System.out.println(num);
                    break;
                }
            }
        }
    }
}

输出

/tmp$ javac RandomNum.java
/tmp$ java RandomNum
5
1
3 
2
4
6

其他选项

原则上,您可以使用其他数据结构来保存生成的随机数,例如ListSet具有相对快速搜索的优点,以防您想要生成超过6个值。您可以使用ArrayList获得类似的效果。然而,Set的使用有一个更重要的优点,它反映了你想要的语义(一个无序的非重复值集)。您不关心集合中的排序,而不需要重复值List是有序的值集合,Set是一组无序值(意味着元素不能在Set中重复,并且它们彼此之间没有关系关于它们被添加到Set的时间。在编码时,几乎总是选择不仅工作的数据结构,而是反映你的意思的语义。< / p>

答案 2 :(得分:0)

小问题:为什么要rand.nextInt((6-1) + 1)代替rand.nextInt(6)

现在,关于手头的任务:我想从可能的数字列表开始;随机选择列表中的一个现有索引(结果是该索引处的数字);从列表中删除该号码。当列表为空时,您不能再使用数字。

关于该解决方案的好处是,您不必重复尝试多次生成随机数,直到找到尚未使用的随机数。

例子代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Main {

    public static void main(String[] args) {
        final List<Integer> integers = new ArrayList<>();
        final Random rand = new Random();

        // Fill list
        for (int i = 1; i <= 6; i++) {
            integers.add(i);
        }

        // Take numbers in random order
        while (!integers.isEmpty()) {
            final int index;
            if (integers.size() > 1) {
                index = rand.nextInt(integers.size() - 1);
            } else {
                // rand.nextInt(0) would throw an exception rather than return 0
                index = 0;
            }
            final int result = integers.remove(index);
            System.out.println("Result: " + result);
        }
    }
}

答案 3 :(得分:0)

你可以这样做

public class NonRepreatedRandomNumbers {

    public static void main(String[] args) {
        ArrayList myList = new ArrayList();
        Random rd = new Random();
        int num;
        while(true){
            num = rd.nextInt(6) + 1;
            if(myList.size() ==  6)
                break;
            if(!myList.contains(num)){
                myList.add(num);
                System.out.println(myList);
            }else
                continue;
        }
    }
}