[英]Unique or non repeating random number generation
我正在嘗試使用以下函數生成唯一的隨機數。 每當我在1000個循環中運行代碼時,它也會生成重復的數字。
碼
private static String randomize() {
int count = 10;
List<Integer> digits = createList(count);
Collections.shuffle(digits); // this re-arranges the elements in the list
return listToString(digits);
}
private static <T> String listToString(List<T> list) {
StringBuilder result = new StringBuilder();
for (T object : list) {
result.append(object);
}
return result.toString();
}
private static List<Integer> createList(int size) {
List<Integer> result = new ArrayList<Integer>(size);
for (int i = 0; i < size; i++) {
result.add(i);
}
return result;
}
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
String strName = randomize();
System.out.println(strName);
}
我在Google中搜索了很多內容,還嘗試了ThreadLocal,它沒有幫助我。 對此的任何幫助或指南將非常有幫助。 我的想法是在一個循環內生成10位非重復隨機數。
您不是真的在生成隨機數嗎? 您正在生成10個唯一數字[0..9]的隨機排列。 (例如“ 0123456789”,“ 9834105672”等。)由於只有3268800(10!)個唯一排列,因此您有相當大的機會嘗試1000次來查找重復項。
(我還沒有計算出數學,但是由於1000 ^ 2在10的數量級之內!,我的直覺告訴我,任何給定集合中至少有10%的可能性重復。Google的“生日悖論”細節。)
您想要做的以及@Andrei試圖解釋的是,每次調用randomize()
都要檢查/存儲結果,以確保沒有重復項。 大致:
public static void main(String[] args) {
Set<String> results = new HashSet<>(1000);
while (results.size() < 1000) {
String strName = randomize();
if (!results.contains(strName)) {
System.out.println(strName);
results.add(strName);
}
}
}
當然,除非您實際上想要一組隨機數:
public static void main(String[] args) {
Set<Long> results = new HashSet<>(1000);
while (results.size() < 1000) {
// Random number on [1E9..1E10]
long random = (long) (Random.nextDouble() * 900000000L) + 100000000L;
if (!results.contains(random)) {
System.out.println(random);
results.add(random);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.