簡體   English   中英

如何在不重復的情況下隨機生成兩個數字?

[英]How should I randomly generate two numbers at the same time without them being duplicated?

我只是想知道如何在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);
 }

解決方案取決於您將使用的規模。 您可以生成數字,直到獲得所需的結果,這在您的情況下是更好的方法,或者如果事先知道內容,您可以“選擇”數字集的隨機元素。

生成直到獲得結果, 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));
}

在某些情況下,您可以通過這種方式節省幾個周期。

以下解決方案使用“虛擬”刪除第一個數字,而不使用列表或集合。 它還針對給定范圍進行了優化,並通過單次調用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);
    }

那么代碼是隨機選取整數,但它同時打印它們而不檢查任何重復。 另外,它沒有指定它必須在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);

有很多方法可以做到這一點,但我相信這是處理它的最簡單方法。

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

由於只有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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM