在Java中生成字母数字随机字符串

11

我正在使用另一个答案中的字符串生成器(String Builder),但我只能使用字母数字,不能使用空格、标点符号等。您能解释一下如何在此代码中限制字符集吗?另外,如何确保它始终为30个字符长?

     Random generator = new Random();
    StringBuilder stringBuilder = new StringBuilder();
    int Length = 30;
    char tempChar ;
    for (int i = 0; i < Length; i++){
        tempChar = (char) (generator.nextInt(96) + 32);
        stringBuilder.append(tempChar);
我已经查看了大部分其他答案,但无法找到解决方案。 谢谢。 如果这是重复的,请不要责怪我。 大多数答案都没有解释控制生成的数字长度或调整字符集的代码部分在哪里。
我还尝试了stringBuilder.Replace(' ','1'),可能有效,但eclipse会提示StringBuilder没有Replace方法。

1
大多数答案没有解释代码的哪个部分控制生成的数字长度或者在哪里调整字符集,指出显而易见的事情通常被认为是粗鲁的。 - Brian Roach
我知道会有人对这个问题感到不满。如果我冒犯了您,我很抱歉,但下面的答案确实增加了该网站可用的知识的丰富性和深度。我认为这不是重复,因为答案对过程进行了更详细的解释。 - PrivusGuru
3个回答

27
如果您想控制字符集和长度,以此为例。
public static String randomString(char[] characterSet, int length) {
    Random random = new SecureRandom();
    char[] result = new char[length];
    for (int i = 0; i < result.length; i++) {
        // picks a random index out of character set > random character
        int randomCharIndex = random.nextInt(characterSet.length);
        result[i] = characterSet[randomCharIndex];
    }
    return new String(result);
}

并且结合

char[] CHARSET_AZ_09 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();

用于指定字符集。

它不基于StringBuilder,因为您知道长度并且不需要所有开销。

它会分配一个正确大小的char[]数组,然后将该数组中的每个单元格填充为输入数组中随机选择的字符。

更多示例请参见:http://ideone.com/xvIZcd


感谢您忽略了那些唱衰者。这个程序完美地运行了! - PrivusGuru
@PrivusGuru 顺便说一句,你发布的代码会生成在(0..95) + 32之间的数字 => 32..127。这些数字对应的字符可以在这里 http://www.asciitable.com/ 找到。按照你的代码方式进行操作将意味着将随机数字限制在48..57 OR 65..90 OR 97..122之间,这样做可能会非常麻烦。(或者像@ Sello建议的那样丢弃不在该范围内的字符) - zapl
@zapl 它是否无碰撞? - Virtu
@Virtu 不,这是随机的。这包括以非常小的概率连续生成相同的字符串10次。 - zapl

2
以下是我使用的内容:
public static String randomStringOfLength(int length) {
    StringBuffer buffer = new StringBuffer();
    while (buffer.length() < length) {
        buffer.append(uuidString());
    }

    //this part controls the length of the returned string
    return buffer.substring(0, length);  
}


private static String uuidString() {
    return UUID.randomUUID().toString().replaceAll("-", "");
}

0
您可以尝试这个:
    //piece
    int i = 0;
    while(i < length){
      char temp =(char) (generator.nextInt(92)+32);
      if(Character.isLetterOrDigit(temp))
      {
        stringBuilder.append(temp);
        ++i;
      }
    }
    System.out.println(stringBuilder);

应该能够实现你的目标

谢谢您的时间和信息。我会在某个地方使用这些内容。 - PrivusGuru

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