2012-08-13 135 views
0

我正在生成随机密码。我的密码长度为8个字符,并且包含特殊字符。我需要保留first letter as alphabet,并且需要对剩余的七个字符进行整理,以便它将成为mixture of alphanumeric + ascii characters随机生成的密码shuffle(随机重新排列)

public String generatePassword() { 
     int passwordLength = MAX_PASSWORD_LENGTH; 
     StringBuffer password = new StringBuffer(passwordLength); 
     //first character as an alphabet 
     password.append(RandomStringUtils.randomAlphabetic(1)).toString(); 
     String alphaNumeric = RandomStringUtils.random(5, true, true); 
     String asciiChars = RandomStringUtils.randomAscii(2); 
     password.append(alphaNumeric).append(asciiChars); 
     return password.toString(); 
    } 

我需要一些帮助来洗牌最后7个字符。怎么做?

+0

为什么你需要洗牌他们,如果他们已经是随机的? – John3136 2012-08-13 07:45:49

+1

'Collections.shuffle'就是你需要的 – artbristol 2012-08-13 07:46:08

+0

随机化/随机序列混洗不会做任何事情,它不会使它更随机。 – 2012-08-13 07:51:00

回答

1

Java Collections API具有内置的shuffle方法,您可以使用:请参阅here。 基本上,您需要从最后7个字符中创建一个List,并将其传递给Collections.shuffle

+0

感谢您的回复Yuushi。 – 2012-08-13 09:17:35

0

如果你没有那么严格的要求,那么你可以添加随机的字符:

Random random = new Random(); 
for (int i = 0; i < 7; i++) { 
    if (random.nextBoolean()) { 
     password.append(RandomStringUtils.random(1, true, true)); 
    } else { 
     password.append(RandomStringUtils.randomAscii(1)); 
    } 
} 

如果你需要一个保证,那有各种的至少一个,那么你可以添加一个简单的测试:

boolean hasAlphaNumeric = false; 
boolean hasAscii = false; 
while (hasAlphaNumeric == false || hasAscii == false) { 
    Random random = new Random(); 
    for (int i = 0; i < 7; i++) { 
    if (random.nextBoolean()) { 
     password.append(RandomStringUtils.random(1, true, true)); 
     hasAlphaNumeric = true; 
    } else { 
     password.append(RandomStringUtils.randomAscii(1)); 
     hasAscii = true; 
    } 
    } 
}