【问题标题】:Java random number with given length [duplicate]给定长度的Java随机数[重复]
【发布时间】:2011-07-20 13:05:42
【问题描述】:

我需要在 Java 中生成一个正好为 6 位的随机数。我知道我可以在随机器上循环 6 次,但在标准 Java SE 中还有其他方法吗?

编辑 - 后续问题:

现在我可以生成我的 6 位数字,但我遇到了一个新问题,我尝试创建的整个 ID 的语法为 123456-A1B45。那么我如何随机化最后 5 个可以是 A-Z 或 0-9 的字符呢?我正在考虑使用 char 值和 randomice 48 - 90 之间的数字,并简单地删除任何获得代表 58-64 的数字的值。这是要走的路还是有更好的解决方案?

编辑 2:

这是我的最终解决方案。感谢大家的帮助!

protected String createRandomRegistryId(String handleId)
{
    // syntax we would like to generate is DIA123456-A1B34      
    String val = "DI";      

    // char (1), random A-Z
    int ranChar = 65 + (new Random()).nextInt(90-65);
    char ch = (char)ranChar;        
    val += ch;      

    // numbers (6), random 0-9
    Random r = new Random();
    int numbers = 100000 + (int)(r.nextFloat() * 899900);
    val += String.valueOf(numbers);

    val += "-";
    // char or numbers (5), random 0-9 A-Z
    for(int i = 0; i<6;){
        int ranAny = 48 + (new Random()).nextInt(90-65);

        if(!(57 < ranAny && ranAny<= 65)){
        char c = (char)ranAny;      
        val += c;
        i++;
        }

    }

    return val;
}

【问题讨论】:

标签: java random


【解决方案1】:

要生成一个 6 位数字:

使用RandomnextInt如下:

Random rnd = new Random();
int n = 100000 + rnd.nextInt(900000);

请注意,n 永远不会是 7 位数字 (1000000),因为 nextInt(900000) 最多可以返回 899999

那么我如何随机化最后 5 个可以是 A-Z 或 0-9 的字符?

这是一个简单的解决方案:

// Generate random id, for example 283952-V8M32
char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
Random rnd = new Random();
StringBuilder sb = new StringBuilder((100000 + rnd.nextInt(900000)) + "-");
for (int i = 0; i < 5; i++)
    sb.append(chars[rnd.nextInt(chars.length)]);

return sb.toString();

【讨论】:

    【解决方案2】:

    100000999999 的范围内生成一个数字。

    // pseudo code
    int n = 100000 + random_float() * 900000;
    

    有关更多详细信息,请参阅Random 的文档

    【讨论】:

    • random_float() 是一个伪代码函数(即它不存在),它返回一个介于 0(包括)和 1(不包括)之间的随机浮点数。
    • 谢谢你,这很好!对我的跟进问题还有什么解决方案吗?
    • 糟糕的伪代码和糟糕的态度
    【解决方案3】:

    如果您需要指定确切的字符长度,我们必须避免前面带有 0 的值。

    最终的字符串表示必须具有准确的字符长度。

    String GenerateRandomNumber(int charLength) {
            return String.valueOf(charLength < 1 ? 0 : new Random()
                    .nextInt((9 * (int) Math.pow(10, charLength - 1)) - 1)
                    + (int) Math.pow(10, charLength - 1));
        }
    

    【讨论】:

      【解决方案4】:

      试试这个:

      public int getRandomNumber(int min, int max) {
          return (int) Math.floor(Math.random() * (max - min + 1)) + min;
      }
      

      【讨论】:

        【解决方案5】:
        int rand = (new Random()).getNextInt(900000) + 100000;
        

        编辑:修复了 off-by-1 错误并删除了无效的解决方案。

        【讨论】:

        • 将一个巨大的数字修改为 899999 不一定会导致均匀随机化。
        • 应该是nextInt() 而不是getNextInt()
        【解决方案6】:

        对于后续问题,你可以得到一个介于 36^5 和 36^6 之间的数字,并以 36 为底进行转换

        更新:

        使用此代码

        http://javaconfessions.com/2008/09/convert-between-base-10-and-base-62-in_28.html

        写了 BaseConverterUtil.toBase36(60466176+r.nextInt(2116316160))

        但在您的用例中,它可以通过使用StringBuilder 并以相反的顺序进行优化,即 71 应在 Z1 而不是 1Z 中转换

        已编辑:

        【讨论】:

        • 感谢您的回答,但我不确定您的意思?你能解释一下吗?
        【解决方案7】:

        这对你有用吗?

        public class Main {
        
        public static void main(String[] args) {
            Random r = new Random(System.currentTimeMillis());
            System.out.println(r.nextInt(100000) * 0.000001);
        }
        

        }

        结果例如0.019007

        【讨论】:

        • 看来我来晚了一点:)
        • 你可以跳过currentTimeMillis的参数。 Random() 构造函数有更好的方法。
        【解决方案8】:

        生成一个随机数(始终介于 0-1 之间)并乘以 1000000

        Math.round(Math.random()*1000000);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-18
          • 1970-01-01
          • 2015-09-13
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-14
          • 1970-01-01
          相关资源
          最近更新 更多