2014-02-07 34 views
0

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

回答

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

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

+0

它不會在同一時間打印他們自己的代碼.. – Dropout

+0

實際上,如果它位於循環內部,它將同時打印出來。 – rullzing

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

在某些情況下,你可以節省幾個週期的這種方式。

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

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); 
    } 
+0

我的下巴剛剛下降。我必須對此絕對敬畏。 – Dropout

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); 
    } 
相關問題