【问题标题】:Generate 9 million unique random numeric only string生成 900 万个唯一的随机数字字符串
【发布时间】: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 个月内发送给客户的优惠券代码。所以正如克劳德所说,它应该是不可预测的。
  • 我发布了我对这个问题的回答,但忘记在此处勾选相应的答案。

标签: java random uniqueidentifier unique-id


【解决方案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 生成短代码时使用这种方法(这可能导致重复)。如果您的时间要求不严格,这是一个可行的选择。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-21
            • 2010-10-18
            • 2011-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多