【问题标题】:How to create a random 16 digits number, with specific first digits?如何创建一个随机的 16 位数字,具有特定的第一位数字?
【发布时间】:2015-01-08 15:41:34
【问题描述】:

我想在 java 中创建一个随机生成的 16 位数字。但是有一个问题,我需要前两位数字为“52”。例如,5289-7894-2435-1967。 我正在考虑使用随机生成器并创建一个 14 位数字,然后添加一个整数 5200 0000 0000 0000。 我试图寻找类似的问题,并不能真正找到有用的东西。我不熟悉数学方法,也许它可以为我解决问题。

【问题讨论】:

  • 生成(伪)随机数。用'52'作为前缀?
  • 一个谷歌搜索。其余的应该很容易。 stackoverflow.com/questions/3709521/…
  • 是的,我也有过这样的想法,但我不知道该怎么做。这是我一开始的问题。
  • 您的想法是,随机创建一个 14 位数字,然后向其添加 5200000000000000(或将其转换为字符串并添加 "52")是有道理的。您是否关心是否可以生成每个可能的 14 位数字,或者如果您的随机数生成器错过了一些可能性,是否可以接受?你关心分布有多均匀吗?

标签: java


【解决方案1】:

首先,您需要生成一个随机的 14 位数字,就像您所做的那样:

long first14 = (long) (Math.random() * 100000000000000L);

然后在开头添加52

long number = 5200000000000000L + first14;

由于Math.random() 创建了一个内部Random 对象,因此同样可以使用另一种方法,并且可以节省内存:

//Declare this before you need to use it
java.util.Random rng = new java.util.Random(); //Provide a seed if you want the same ones every time
...
//Then, when you need a number:
long first14 = (rng.nextLong() % 100000000000000L) + 5200000000000000L;
//Or, to mimic the Math.random() option
long first14 = (rng.nextDouble() * 100000000000000L) + 5200000000000000L;

请注意,nextLong() % n 不会提供完全随机的分布,这与Math.random() 不同。但是,如果您只是生成测试数据并且它不必是加密安全的,它也可以工作。由你决定使用哪一个。

【讨论】:

    【解决方案2】:
    Random rand = new Random();
    String yourValue = String.format((Locale)null, //don't want any thousand separators
                            "52%02d-%04d-%04d-%04d",
                            rand.nextInt(100),
                            rand.nextInt(10000),
                            rand.nextInt(10000),
                            rand.nextInt(10000));
    

    【讨论】:

      【解决方案3】:

      您可以生成 14 个随机数字,然后在开头附加“52”。例如

      public class Tes {
      
          public static void main(String[] args) {
              System.out.println(generateRandom(52));
          }
      
          public static long generateRandom(int prefix) {
              Random rand = new Random();
      
              long x = (long)(rand.nextDouble()*100000000000000L);
      
              String s = String.valueOf(prefix) + String.format("%014d", x);
              return Long.valueOf(s);
          }
      }
      

      【讨论】:

      • 如果您不想使用String 进程来添加数字,您也可以通过将5200000000000000(加或减几个零)添加到x 来添加52 .我觉得它更干净。
      • 实际上,您发布的使用String 添加前缀的代码是错误的。如果x 小于 10^13,它将失败。你需要像String.format("%014d", x) 这样的东西。
      • (long)(rand.nextDouble()*100000000000000L)的位数是否均匀分布?使用它可能会更好:stackoverflow.com/a/2546186/1178016
      【解决方案4】:
      • 创建一个 14 位随机数字。与Math.random
      • 在“52”String 的开头连接到它。
      • Integer.parseInt(String)方法转换字符串

      【讨论】:

      • 很遗憾,您还没有解释如何进行第一步。这不是微不足道的,因为 Random.nextLong() 不允许您指定边界,这与 Random.nextInt(bound) 不同。
      猜你喜欢
      • 2021-01-27
      • 1970-01-01
      • 2013-07-13
      • 2012-04-29
      • 2021-09-05
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多