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

时间:2014-03-05 08:50:12

标签: java random uniqueidentifier unique-id

Queustion 1:我们能否生成8位数独特的9-10万个仅数字字符串?

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

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

在一个循环中,但会产生大量重复。为了消除重复,我使用了HashSet,但是我在线程“main”java.lang.OutOfMemoryError中得到了Exception:集合中大小为~140xxxx之后的Java堆空间。还有其他任何方法来生成此输出吗?

5 个答案:

答案 0 :(得分:4)

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

您需要小心选择改组算法;我听说Fisher-Yates非常好。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

<强> Q1。我们能否生成8位数独特的9-10万个仅数字字符串?

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

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

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

<强> Q2。如何生成9到1000万个唯一的数字&#39;一个程序中的字符串运行?

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

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();
                }
            }
        }
    }
}

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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