Java中生成由A-Z和0-9组合的随机字符串

93

正如标题所示,我需要创建一个 17 个字符长的随机 ID。类似于 "AJB53JHS232ERO0H1"。字母和数字的顺序也是随机的。我考虑创建一个包含字母 A-Z 的数组和一个随机取值范围在 1-2 的“检查”变量。然后,在循环中:

Randomize 'check' to 1-2.
If (check == 1) then the character is a letter.
Pick a random index from the letters array.
else
Pick a random number.

但我觉得有更简单的方法。有吗?


2
https://dev59.com/snVD5IYBdhLWcg3wQJKT - aquaraga
你可以将字母和数字放入一个数组中,然后随机选择其中的元素,直到达到所需的大小。 - wxyz
4个回答

138

在这里,您可以使用我的方法生成随机字符串。

protected String getSaltString() {
        String SALTCHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        StringBuilder salt = new StringBuilder();
        Random rnd = new Random();
        while (salt.length() < 18) { // length of the random string.
            int index = (int) (rnd.nextFloat() * SALTCHARS.length());
            salt.append(SALTCHARS.charAt(index));
        }
        String saltStr = salt.toString();
        return saltStr;

    }

上面的方法是我使用的一种从我的包里生成用于登录目的的盐字符串的方法。


1
我可以建议用StringBuilder替换StringBuffer,这里不需要线程安全的实现。 - user180100
12
只要你知道字符数组的长度,就可以创建一个 char[]。不需要添加任何内容。我还会使用 Random.nextInt 而不是调用 nextFloat 并将其乘以长度。 - Jon Skeet
2
请注意,数字的平均数量与字母的数量不同。 - Martijn Courteaux
@RC。是的。我在servlet环境中使用它。所以需要它。否则使用StringBuilder。 - Suresh Atta
使用此功能时需要记住的一件事是,Random类是伪随机而不是真正的随机。尝试使用它将400个字符串打印到文件中,发现它并不像我想要的那样随机。:( - SharpInnovativeTechnologies
@SharpIncTechAndProgramming 你尝试过使用SecureRandom吗?据我所知(也许我错了),最好为生成的所有字符串提供相同的Random实例。 - Delark

120

3
考虑更新答案,因为Apache在commons-text中已将其替换为“RandomStringGenerator”。 - Neria Nachum
2
你也可以使用 RandomStringUtils.random(length, useLetters, useNumbers),其中 length 是 int 类型,而 useLetters 和 useNumbers 是 boolean 类型的值。 - Pratik Patel
1
超棒,单行代码,我们需要这种类型的代码。 - Rajesh Om
3
你在哪里看到RandomStringUtils已被替换或弃用了?我只看到一条信息:"RandomStringUtils旨在用于简单的用例。对于更复杂的用例,请考虑使用Apache Commons Text的RandomStringGenerator",可以在这里找到(https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RandomStringUtils.html)。 - wileyquixote
1
使用RandomStringGenerator(来自apachae common)可以生成所需长度的随机字符串。以下代码段将生成长度在5-15之间的字符串(包括5和15)。// char [][] pairs = {{'a','z'},{'A','Z'},{'0','9'}}; RandomStringGenerator randomStringGenerator = new RandomStringGenerator.Builder() .withinRange(pairs) .build(); String randomString = randomStringGenerator.generate(5, 15); // - Ajay Singh

20

实现函数的三个步骤:

第一步,您可以指定一个包含大写字母 A-Z 和数字 0-9 的字符串。

例如:

 String candidateChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

步骤#2 如果您想从该候选字符串生成随机字符,可以使用:

 candidateChars.charAt(random.nextInt(candidateChars.length()));

第三步 最后,指定要生成的随机字符串的长度(在您的说明中是17)。 编写一个for循环,并将步骤#2中生成的随机字符附加到StringBuilder对象。

基于此,这是一个例子 public class RandomTest {

public static void main(String[] args) {

    System.out.println(generateRandomChars(
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 17));
}

/**
 * 
 * @param candidateChars
 *            the candidate chars
 * @param length
 *            the number of random chars to be generated
 * 
 * @return
 */
public static String generateRandomChars(String candidateChars, int length) {
    StringBuilder sb = new StringBuilder();
    Random random = new Random();
    for (int i = 0; i < length; i++) {
        sb.append(candidateChars.charAt(random.nextInt(candidateChars
                .length())));
    }

    return sb.toString();
}

}

8
你可以使用 for 循环轻松完成这个任务:
public static void main(String[] args) {
  String aToZ="ABCD.....1234"; // 36 letter.
  String randomStr=generateRandom(aToZ);

}

private static String generateRandom(String aToZ) {
    Random rand=new Random();
    StringBuilder res=new StringBuilder();
    for (int i = 0; i < 17; i++) {
       int randIndex=rand.nextInt(aToZ.length()); 
       res.append(aToZ.charAt(randIndex));            
    }
    return res.toString();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接