gpt4 book ai didi

java - 唯一或不重复的随机数生成

转载 作者:行者123 更新时间:2023-12-02 11:09:22 24 4
gpt4 key购买 nike

我正在尝试使用以下函数生成唯一的随机数。每当我以 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);
}
}
}

关于java - 唯一或不重复的随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50707798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com