一、從Random生成不重複的隨機數
Java中的java.util.Random可以生成隨機數,但是它並不能保證所生成的隨機數是不重複的,因為它只是根據種子數生成隨機數。如果我們需要生成不重複的隨機數,可以採用以下方法:
Random random = new Random();
Set<Integer> set = new HashSet<>();
for (int i = 0; i < n; i++) {
int x = random.nextInt(n * 10);
while (set.contains(x)) {
x = random.nextInt(n * 10);
}
set.add(x);
}
這裡使用了Set來存儲生成的隨機數,如果生成的隨機數已經存在於Set中,就繼續生成,直到生成的隨機數不重複為止。
二、不重複隨機數生成器
我們也可以自己實現一個不重複隨機數生成器。具體實現方法為,將所有可能的數存入一個List中,然後隨機取出一個數,並將該數從List中刪除。這樣可以保證所生成的隨機數不重複。
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(i);
}
Collections.shuffle(list);
for (int i = 0; i < n; i++) {
int x = list.get(i);
}
三、Oracle生成隨機數字不重複選取
Oracle提供了DBMS_RANDOM包,可以用它來生成一個指定範圍內的隨機數,而且可以保證所生成的隨機數不重複。
CREATE TABLE random_table (
id NUMBER(10) PRIMARY KEY,
value NUMBER(10)
);
DECLARE
n NUMBER(10) := 1000;
BEGIN
FOR i IN 1 .. n LOOP
INSERT INTO random_table(id, value) VALUES(i, DBMS_RANDOM.VALUE(1, n));
END LOOP;
END;
/
SELECT * FROM (
SELECT * FROM random_table ORDER BY value
)
WHERE rownum <= 100;
這裡我們先創建一個包含指定個數的數據表random_table,並給每一行生成一個隨機數,然後再從中選取指定個數的隨機數。由於DBMS_RANDOM.VALUE函數生成的隨機數都不同,因此可以保證所選取的隨機數不重複。
四、總結
Java生成不重複的隨機數可以通過隨機生成後去重、自己實現不重複隨機數生成器、Oracle中的DBMS_RANDOM包等多種方式實現。具體要根據實際需求來選擇合適的方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/242390.html
微信掃一掃
支付寶掃一掃