我想生成一對隨機數而不重複對。我怎麼能在java中實現它?在java中不產生重複對的隨機數對
-3
A
回答
0
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() + ")");
}
}
}
相關問題
- 1. 隨機數發生器產生重複
- 2. 生成隨機數對,沒有重複
- 3. Java產生隨機玩家對
- 4. 在java中產生短的隨機數?
- 5. 在java中產生一對隨機數,使得p!= q
- 6. Java生成非重複的隨機數
- 7. java隨機發生器不重複
- 8. 想在1-45之間產生隨機數而不重複
- 9. 在Java中生成隨機對象
- 10. 隨機代碼種子生產重複
- 11. C#隨機碼場產生的對象
- 12. Howdo顯示在TextView中對TE碎石產生的隨機數
- 13. 在畫布中隨機生成不重複或重疊的對象
- 14. 隨機產生整數不重複,沒有陣列
- 15. 隨機數發生器不重複
- 16. 生成隨機數字而不重複
- 17. 生成隨機對象以獲取java產生
- 18. 隨機數產生
- 19. 隨機數產生
- 20. 機器人 - 產生隨機數且無重複
- 21. 不重複的隨機數
- 22. 在java中生成一個隨機點數組沒有重複
- 23. 在java數組中不重複的隨機數字
- 24. 產生重複結果的隨機函數
- 25. 低效代碼:防止產生重複的隨機數
- 26. 產生非重複數的隨機二維陣列,爪哇
- 27. UUID隨機數的產生
- 28. 在Python中 - 如何生成不重複的隨機數字
- 29. 隨機種子來產生隨機數
- 30. Android - 生成非重複的隨機數
你的意思是2個隨機數不應該相等嗎? – McNultyyy
請*分享*無論你有*嘗試*迄今。 –
你想要做多久?對重複意味着排序嗎?也請分享你已經嘗試過 –