2015-09-07 66 views
-3

我想生成一對隨機數而不重複對。我怎麼能在java中實現它?在java中不產生重複對的隨機數對

+1

你的意思是2個隨機數不應該相等嗎? – McNultyyy

+0

請*分享*無論你有*嘗試*迄今。 –

+1

你想要做多久?對重複意味着排序嗎?也請分享你已經嘗試過 –

回答

0
Random r = new Random(); 
int x, y; 

do { 
    x = r.nextInt(); 
    y = r.nextInt(); 
} while (x == y); 
+0

這將不會重用任何數字在所有,所以除了不再產生相同的對之外,它不會產生包含已經使用的數字的任何對。雖然這個問題很模糊,我想只有同一對不應該創建兩次!? – tringel

+0

我完全不明白他在問什麼,他似乎沒有迴應評論,所以我給了他我想他想要的東西(兩個非相同的數字)。 – McNultyyy

0

我們需要跟蹤已經生成的配對。下面的代碼應該做的:

Random random = new Random(); 
Map<Integer, Integer> generated = new HashMap<Integer, Integer>(); 
int x,y; 
do{ 
    x = random.nextInt(); 
    y = random.nextInt(); 
    if(!generated.containsKey(x) || generated.get(x) != y){ 
     generated.put(x, y); 
     break; 
    } 
}while(true); 
0

如果你需要超過2個號碼,這種方法可能更爲有效:

List<Integer> integers = IntStream.range(1, 10) 
     .boxed() 
     .collect(Collectors.toList()); 

Collections.shuffle(integers); 

System.out.println(integers.get(0)); 
System.out.println(integers.get(1)); 
0

據我理解你的問題,你想生成隨機數對而不重複它們。爲此,我們首先需要一個擁有這些值的類,因爲它是一對數字,我稱它爲元組。

public class Tuple { 
    private Integer first; 
    private Integer second; 

    public Tuple(int first, int second) { 
     this.first = first; 
     this.second = second; 
    } 

    public int getFirst() { 
     return first; 
    } 

    public int getSecond() { 
     return second; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     Tuple tuple = (Tuple) o; 
     return first.equals(tuple.first) && second.equals(tuple.second); 
    } 

    @Override 
    public int hashCode() { 
     int result = first.hashCode(); 
     result = 31 * result + second.hashCode(); 
     return result; 
    } 
} 

然後我們需要一個生成器類來保存可能出現在一對中的最高可能整數。請注意,這個數字限制了多少對可能,因爲您可以使用包含1 ... n個數字作爲第一個數字的圓括號,並且每個數字再次爲1 ... n個數字,您可以最多返回n * n個元組!

public class RandomTuples { 
    private final int highestInt; 
    private final Set<Tuple> usedTuples = new HashSet<>(); 

    public RandomTuples(int highestInt) { 
     this.highestInt = highestInt; 
    } 

    public Tuple nextTuple() { 
     if (usedTuples.size() >= highestInt*highestInt) { 
      throw new RuntimeException("All possible tuples were used. " + 
        "Use a higher param when instantiating RandomTuples for more!"); 
     } 

     Random rnd = new Random(); 

     Tuple tuple = Stream 
       .generate(() -> new Tuple(rnd.nextInt(highestInt), rnd.nextInt(highestInt))) 
       .filter(filterTuple -> !usedTuples.contains(filterTuple)) 
       .limit(1).findFirst().get(); 
     usedTuples.add(tuple); 
     return tuple; 
    } 
} 

這裏的例外是至關重要的,否則流將會陷入死鎖。它將generate新的元組試圖獲得至少一個匹配條目(limit(1)),而filter然後將刪除此項創建一個無限循環......

然後,你必須實例化RandomTouples類並調用生成方法來獲得新元組。當使用高數字時,這可能會導致性能相當差,因爲它必須嘗試可能的組合,直到找到尚未使用的組合。

public class RandomTuplesExample { 

    public static void main(String[] args) { 

     RandomTuples randomTuples = new RandomTuples(10); 
     for (int i = 0; i < 100; i++) { 
      Tuple tuple = randomTuples.nextTuple(); 
      System.out.println("(" + tuple.getFirst() + ", " + tuple.getSecond() + ")"); 
     } 
    } 
}