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

Posted

技术标签:

【中文标题】生成 900 万个唯一的随机数字字符串【英文标题】:Generate 9 million unique random numeric only string 【发布时间】:2014-04-07 05:07:34 【问题描述】:

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

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

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

在一个循环中,但会产生很多重复。为了消除重复,我使用了 HashSet,但我在线程“main”java.lang.OutOfMemoryError 中出现异常:集合中 ~140xxxx 大小后的 Java 堆空间。还有其他方法可以生成此输出吗?

【问题讨论】:

您的一般方法可能是错误的。为什么不能在 db 中尝试序列? 为什么不多几位,那你就可以使用UUID了?少了很多麻烦。 @arghtype:通常这是一种有用的方法,但有时重要的是,接收这些数字的人(也许他们是某种 ID)不应该能够从中预测或推断出任何东西.例如,如果我得到 12345678 而你得到 23456789,在某些情况下,最好在我得到我的号码后无法推断出你得到了你的号码。所以随机性可以占有一席之地,前提是它有真正的用例。 我不能使用 db 序列,因为这些数字是在接下来的 6 个月内发送给客户的优惠券代码。所以正如克劳德所说,它应该是不可预测的。 我发布了我对这个问题的回答,但忘记在此处勾选相应的答案。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

第一季度。我们可以生成 8 位唯一的 9-1000 万个数字字符串吗?

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

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

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

第二季度。如何在一个程序运行中生成 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();
                
            
        
    

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于生成 900 万个唯一的随机数字字符串的主要内容,如果未能解决你的问题,请参考以下文章

生成带有小写字母和数字的唯一随机字符串

VBA 生成随机唯一的字母数字字符串

PHP生成随机或者唯一字符串

随机生成唯一的四位字符串-由大小写字母和数字组成

生成唯一且随机的整数

如何用VB.NET生成一个随机字符串