由于字符使用整数来编码,所以产生随机字符就是产生一个随机整数。
Java使用Unicode编码,每个字符都有一个唯一的码值,范围在 0H~FFFFH 。
所以可以通过生成0~65535之间的一个随机整数来产生Unicode所有字符,例如下面的随机数:
(int)(Math.random()*(65535+1)); // 因为随机函数不产生1.0,所以要+1
若想生成小写字母该咋办呢?
那就产生'a'~'z'之间的随机数呗,例如:
(int)((int)'a'+Math.random()*((int)'z'-(int)'a'+1)); // 'a'的Unicode是 (int)'a'
由于Java中+-*/%均可以应用到char上,所以上面的表达式可以简化为下面:
'a'+Math.random()*('z'-'a'+1);
产生了想要的数之后就可以转换成字符了:
(char)('a'+Math.random()*('z'-'a'+1));
在拓展一下,通过上面的例子就可以生成任意两个字符ch1,ch2之间的随机字符:
(char)(ch1+Math.random()*(ch2-ch1+1));
class RandomCharacter {
public static char getRandomCharacter(char ch1, char ch2) {
return (char) (ch1 + Math.random() * (ch2 - ch1 + 1));
}
public static char getRandomLowerCaseLetter() {
return getRandomCharacter('a', 'z');
}
public static char getRandomUpperCaseLetter() {
return getRandomCharacter('A', 'Z');
}
public static char getRandomDigitLetter() {
return getRandomCharacter('0', '9');
}
public static char getRandomCharacter() {
return getRandomCharacter('\u0000', '\uFFFF');
}
}
public class test {
public static void main(String[] args) {
for (int i = 0; i < 30; i++) {
char ch = RandomCharacter.getRandomLowerCaseLetter();
System.out.print(ch);
}
System.out.println();
for (int i = 0; i < 30; i++) {
char ch = RandomCharacter.getRandomCharacter();
System.out.print(ch);
}
}
}