如何在不重复的情况下随机生成两个数字?

时间:2014-02-07 05:24:29

标签: java loops random

我只是想知道如何在java中生成两个彼此不同的数字。

我想随机选择1-3之间的两个数字,但是,我不希望它们是相同的数字?

我应该怎么做?我试图使用一个循环,我不断得到相同的数字

这就是我做的事情

 Random random = new Random();

 for(int i =0; i<3; i++){
      int randomInteger = random.nextInt();
      System.out.println("Random Integer in Java: " + randomInteger);
 }

5 个答案:

答案 0 :(得分:1)

解决方案取决于您将使用的比例。您可以生成数字,直到获得所需的结果,这在您的情况下是更好的方式,或者如果事先知道内容,您可以“选择”数字集的随机元素。

生成,直到您获得结果,并使用while拒绝:

Random random = new Random();

int first = random.nextInt(3)+1;
int second;

while(second == null || first == second){
    second = random.nextInt(3)+1;
}

如果您需要更大的集合中的两个以上的数字,您可以考虑使用数组或列表作为结果。检查结果是否全部准备就好了。

另一种方法是从混乱的集合中选择数字。

List<Integer> numberSet = new ArrayList<>();
for(int i = 1; i<=3; i++){
    numberSet.add(i);
}
Collections.shuffle(numberSet);

for(int j = 0; j<2; j++)
{
    System.out.println(numberSet.get(j));
}

在某些情况下,您可以通过这种方式保存几个周期。

答案 1 :(得分:1)

以下解决方案使用“虚拟”删除第一个数字,而不使用列表或集合。它还针对给定范围进行了优化,并通过单次调用Random.nextInt()来获取两个值。

    Random rand = new Random();
    for (int k=0; k<10; k++) {
        int v12=rand.nextInt(6);
        int v1=v12>>1;
        int v2=v12 & 0x1;
        if (v2>=v1) v2++;
        v1++; v2++; // from 0..2 to 1..3
        System.out.println("" + v1+" "+v2);
    }

答案 2 :(得分:0)

代码是随机选取整数,但它同时打印它们而不检查任何重复。此外,它没有指定它必须介于1-3之间

所以这是如何做到的。

当然,您首先需要import java.util.Random

Random rand = new Random();
int value = rand.nextInt(3) +1;  // this will choose a number between 1-3 not 0-2
int secondvalue = rand.nextInt(3) +1; // same thing but we need 2 of them since we want 2 random numbers and not only 1 !

while(value == secondvalue) { //to see if the first random number = the second 
    secondvalue = rand.nextInt(3) +1; // if so, regenerate the second randomly
}

// and finally print them
System.out.println(" Value is " + value);
System.out.println(" Value is " + second value);

有很多方法可以做到这一点,但我相信这是处理它的最简单方法。

答案 3 :(得分:0)

Random random = new Random();

Set<Integer> twoSet = new HashSet<>();

while (twoSet.size() < 2) {
    twoSet.add(random.nextInt(someNumber);
}

请注意,如果你的范围太小,这将无休止地循环。

此外,您可能需要查看此内容:http://en.wikipedia.org/wiki/Reservoir_sampling

答案 4 :(得分:0)

由于只有6种可能的答案组合,因此可以将它们放在一个表中,然后从该表中随机检索:

static int[] v1s=new int[]{1,1,2,2,3,3};
static int[] v2s=new int[]{2,3,1,3,1,2};

    Random rand = new Random();
    for (int k=0; k<10; k++) {
        int v12=rand.nextInt(6);
        int v1=v1s[v12];
        int v2=v2s[v12];
        System.out.println("" + v1+" "+v2);
    }