代码之家  ›  专栏  ›  技术社区  ›  vvra

生成900万唯一随机数字字符串

  •  1
  • vvra  · 技术社区  · 10 年前

    问题1:我们能生成8位唯一的9-1000万只数字字符串吗?

    问题2:如何在一次程序运行中生成900万到1000万个唯一的“仅数字”字符串?这些密钥将被上传到数据库,供未来6个月使用。我试过了

    Math.floor(Math.random() * 10000000) + 10000000; 
    

    但会产生大量重复。为了消除重复,我使用了HashSet,但在线程“main”java.lang.OutOfMemoryError中得到了异常:集合中~140xxxx大小之后的java堆空间。有其他方法产生这种输出吗?

    5 回复  |  直到 10 年前
        1
  •  4
  •   T.J. Crowder    10 年前

    创建唯一随机数块的标准方法是首先按顺序(例如,在数组中)创建数字,然后对其进行随机排序。

    你在选择洗牌算法时需要小心;我听说了 Fisher-Yates 非常好。

        2
  •  1
  •   AlexR    10 年前

    如果是一次性运行,只需使用命令行选项增加堆 -Xmx2048M (2G只是一个例子)。

        3
  •  1
  •   Ravi Kumar    10 年前

    Q1.我们可以生成8位唯一的9-10百万数字字符串吗?

    是的,您可以使用10位数字1,2,3,4,5,6,7,8,9,0生成10000000个8位唯一数字字符串

    若你们为所有可能的组合编写了正确的逻辑,你们不会得到任何重复,但为了安全起见,你们可以使用set。

    当您得到java.lang.OutOfMemoryError错误时,这是因为您生成了这么多数字并将其保存在内存中。解决方法是生成一些小的数字块并将其保存到数据库中,然后清除列表,再次填充下一个数字块并保持重复,直到将所有数字保存到数据库。

    Q2.如何在一次程序运行中生成900万到1000万个唯一的“仅数字”字符串?

    下面是一个组合代码,您可以使用它来实现您的目标

    public class Combination{
        public static int count = 0;
        public static ArrayList<String> list;
    
        public Combination(){
            list = new ArrayList<String>();
        }
        public static void main(String[] args){
            Combination c = new Combination();
            Scanner sc = new Scanner(System.in);
            String str = sc.next();
            int num = sc.nextInt();
            if(num>str.length()){
                System.out.println("This combination is not possible");
                System.out.println(num+" should be less than or equal to the length of the string "+str);
            }else{
                System.out.println("Processing....");
                char[] array = new char[num];
                c.fillNthCharacter(0,array,str);
                System.out.println("Total combination = "+count);
            }
        }
    
        public static void fillNthCharacter(int n,char[] array,String str){
            for(int i=0;i<str.length();i++){
                array[n]=str.charAt(i);
                if(n<array.length-1){
                    fillNthCharacter(n+1,array,str);
                }else{
                    count++;
                    //System.out.println(new String(array));
                    list.add(new String(array));
                    if(list.size()>100000){
                        //code to add into database
                        list.clear();
                    }
                }
            }
        }
    }
    
        4
  •  1
  •   vvra    10 年前

    我只是简单地增加了vm内存大小,并运行应用程序生成了900万张优惠券。感谢大家有兴趣回答这个问题。

        5
  •  0
  •   namero999    10 年前

    您可以将它们存储在数据库中,并在存储它们的列上放置索引(如果出现DuplicateKeyException,则使用一个唯一的约束和一个要重试的循环)。更好的是,您可以编写一个存储过程来执行它,并直接对数据库进行操作。我在为URL生成短代码时使用这种方法(这可能导致重复)。如果您的时间要求不严格,这是一个可行的选择。