2010-10-31 194 views
0

下面的代码返回?而不是随机字符。有任何想法吗?请注意,我把这写成了方法重载练习的一部分,因此这个'复杂'的设置。使用unicode值打印字符(java)

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') ; 
    } 
} 

回答

3

您的代码打印无法通过控制台或它的字体显示的字符。

+0

嗨SLaks,我试图写它到一个文件,但它也写了'?' – raoulbia 2010-10-31 15:48:50

+0

@Baba:你需要将它写入一个Unicode文件。 – SLaks 2010-10-31 15:57:03

+0

你指定了什么文件编码?使用UTF-8。 – 2010-10-31 15:58:14

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 
0

你可以将它们转换成ASCII码:

(焦炭)((INT)(Math.abs(CH1 +的Math.random()*(CH2 - CH1))%128))

那应该在控制台上只显示0-127的ASCII字符。

0

如前所述,您的控制台,导入和字体有问题。

然而:
您的实现有时会返回未定义的字符,因为不是每个char的值都是有效的Unicode字符。 Character.isDefined(char ch)提供了一个检查是否以Unicode定义了字符。一个快速的解决方案可能看起来像这样,但当然对于随机进程使用不良边界时只能包含无效的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;}; 
    } 
    }