Java 唯一或非重复随机数生成

Java 唯一或非重复随机数生成,java,random,Java,Random,我正在尝试使用下面的函数生成唯一的随机数。当我以1000的循环运行代码时,它也会生成重复的数字 代码 私有静态字符串随机化(){ 整数计数=10; 列表位数=createList(计数); Collections.shuffle(数字);//这将重新排列列表中的元素 返回listToString(数字); } 私有静态字符串listToString(列表){ StringBuilder结果=新建StringBuilder(); for(T对象:列表){ 结果。追加(对象); } 返回result

我正在尝试使用下面的函数生成唯一的随机数。当我以1000的循环运行代码时,它也会生成重复的数字

代码

私有静态字符串随机化(){
整数计数=10;
列表位数=createList(计数);
Collections.shuffle(数字);//这将重新排列列表中的元素
返回listToString(数字);
}
私有静态字符串listToString(列表){
StringBuilder结果=新建StringBuilder();
for(T对象:列表){
结果。追加(对象);
}
返回result.toString();
}
私有静态列表createList(整数大小){
列表结果=新的ArrayList(大小);
对于(int i=0;i

我在google上搜索了很多,也尝试了ThreadLocal,它对我没有帮助。任何关于这方面的帮助或指导都会非常有用。我的想法是在一个循环中生成10位非重复随机数。

你不是真的生成随机数,是吗?你是在生成10位唯一数字[0..9]的随机排列。(例如。“0123456789”、“9834105672”等)由于只有3268800(10!)个唯一排列,因此您有相当大的机会通过1000次尝试找到重复的排列

(我还没有算出数字,但由于1000^2在10的数量级范围内,我的直觉告诉我,在任何给定的集合中,至少有10%的几率是重复的。谷歌“生日悖论”获取详细信息。)

您想做的,@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);
        }
    }
}
publicstaticvoidmain(字符串[]args){
设置结果=新哈希集(1000);
while(results.size()<1000){
字符串strName=randomize();
如果(!results.contains(strName)){
System.out.println(strName);
结果:添加(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);
        }
    }
}
publicstaticvoidmain(字符串[]args){
设置结果=新哈希集(1000);
while(results.size()<1000){
//[1E9..1E10]上的随机数
长随机=(长)(random.nextDouble()*90000000L)+100000000升;
如果(!results.contains(随机)){
系统输出打印项次(随机);
结果:添加(随机);
}
}
}

如果是随机数,则可以重复。否则,您可以将已存在的数字存储在列表中,并在每次生成后检查数字是否已存在创建随机数列表,然后在repeated@AndreiSuvorkov通过任何算法都不可能唯一?您可以将生成的每个数字存储在一个列表中,并检查下一个数字已生成列表。如果列表已生成,则重新洗牌的可能副本
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);
        }
    }
}