1

问题 1:我们可以生成 8 位唯一的 9-10 百万个数字字符串吗?

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

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

在一个循环中,但会产生很多重复。为了消除重复,我使用了 HashSet,但我在线程“main”java.lang.OutOfMemoryError: Java heap space after ~140xxxx size in the set 中得到了异常。还有其他方法可以生成此输出吗?

4

5 回答 5

4

创建一个唯一随机数块的标准方法是首先按顺序创建数字(例如,在一个数组中),然后将它们打乱。

您需要谨慎选择洗牌算法;我听说Fisher-Yates很不错。

于 2014-03-05T08:52:31.220 回答
1

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

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

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

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

Q2。如何在一个程序运行中生成 9 到 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();
                }
            }
        }
    }
}
于 2014-03-05T12:44:37.213 回答
1

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

于 2014-03-06T08:00:14.670 回答
1

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

于 2014-03-05T08:53:31.620 回答
0

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

于 2014-03-05T08:54:02.097 回答