我正在尝试使用以下函数生成唯一的随机数。当我在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);
}
我在谷歌搜索了很多,并尝试了ThreadLocal,它没有帮助我。任何有关此的帮助或指南都会非常有用。我的想法是在循环中生成10位非重复随机数。
答案 0 :(得分:1)
你真的没有生成随机数,是吗?您正在生成10个唯一数字[0..9]的随机排列。 (例如&#34; 0123456789&#34;,&#34; 9834105672&#34;等)由于只有3268800(10!)个唯一的排列,你有很大的机会在1000次尝试中击中重复。
(我还没有计算出数学,但是因为1000 ^ 2在10的数量级内!我的直觉告诉我,任何重复的机会至少有10%。给定集.Google&#34;生日悖论&#34;详情。)
你想做什么,以及@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);
}
}
}