给定长度的Java随机数

Java random number with given length

本问题已经有最佳答案,请猛点这里访问。

我需要用Java中的6位数字来生成一个随机数。我知道我可以在一个随机变量上循环6次,但是在标准JavaSE中还有其他方法吗?

编辑-后续问题:

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

编辑2:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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;
}


要生成6位数字:

使用RandomnextInt如下:

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

注意,n永远不会是7位(1000000),因为nextInt(900000)最多只能返回899999

So how do I randomize the last 5 chars that can be either A-Z or 0-9?

下面是一个简单的解决方案:

1
2
3
4
5
6
7
8
// 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();

生成从100000999999范围内的数字。

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

我很确定你已经阅读了文档,例如随机文件,并且可以自己找出其余的。


如果需要指定确切的charactor长度,则必须避免前面有0的值。

最后的字符串表示形式必须具有精确的字符长度。

1
2
3
4
5
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));
    }

试试这个:

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

对于后续问题,您可以得到一个介于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进行优化,并且将数字按相反顺序ie 71转换为z1而不是1z。

编辑:


1
int rand = (new Random()).getNextInt(900000) + 100000;

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


这对你有用吗?

1
2
3
4
5
6
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


生成一个随机数(总是在0-1之间)并乘以1000000

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