下面的代码返回?
而不是随机字符。有任何想法吗?请注意,我写了这个作为方法重载的练习,因此“复杂”的设置。
class TestRandomCharacter
{
public static void main(String[] args)
{
char ch = RandomCharacter.getRandomCharacter() ;
System.out.println(ch);
}//end main
}
class RandomCharacter
{
public static char getRandomCharacter(char ch1, char ch2)
{
return (char)(ch1 + Math.random() * ( ch2 - ch1 )) ;
}
public static char getRandomCharacter()
{
return getRandomCharacter('\u0000','\uFFFF') ;
}
}
答案 0 :(得分:2)
您的代码正在打印控制台或其字体无法显示的字符。
答案 1 :(得分:0)
使用Random类而不是Math.random()。 (但是如果您没有安装扩展地图,则在快速命令中,您无法看到unicode字符,但只能看到ascii)
使用随机对象的.nextInt()方法获取整数。
示例:
如果你想要一个1到40的随机数,你可以写:
Random numRandom = new Random();
int n = numRandom.nextInt(40) + 1; // nextInt(40) give a number from 0 to 39
答案 2 :(得分:0)
您可以将它们转换为ascii:
(char)((int)(Math.abs(ch1 + Math.random()*(ch2 - ch1))%128))
应该只在控制台上显示0-127的ascii字符。
答案 3 :(得分:0)
如前所述,您的控制台,enconding和字体存在问题。
尽管如此:
您的实现有时会返回未定义的字符,因为并非char的每个值都是有效的unicode字符。 Character.isDefined(char ch)检查是否在Unicode中定义了char。一个快速的解决方案可能看起来像这样,但当使用不良边界进行随机过程时,当然可以运行无穷无尽,只包含无效的char值。
public static char getRandomCharacter(char ch1, char ch2)
{
while (true)
{
char ch=(char)(ch1 + Math.random() * ( ch2 - ch1 )) ;
if (Character.isDefined(ch)) {return ch;};
}
}