A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡宝林 中级黑马   /  2012-6-3 17:57  /  1854 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hy19985125 于 2012-6-4 10:53 编辑

public class B {
private static Random rnd = new Random();
   public static void main(String[] args)throws Exception {
    StringBuffer word = null;
       switch(rnd.nextInt(3)) {
           case 1:  word = new StringBuffer('a');
           case 2:  word = new StringBuffer('b');
           default: word = new StringBuffer('c');
       }
       word.append('d');
       word.append('e');
       word.append('f');
       System.out.println(word);
   
}
打印的结果应该是adef,或者bdef,或者cdef,但是最终的结果却是def,为什么求解!!!

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

5 个回复

倒序浏览
你的问题在switch(rnd.nextInt(3))这
在java的API文档中nextInt()这个方法是这么定义的
  public int nextInt(int n)
返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。nextInt 的常规协定是,伪随机地生成并返回指定范围中的一个 int 值。所有可能的 n 个 int 值的生成概率(大致)相同。Random 类按如下方式实现 nextInt(int n) 方法:
public int nextInt(int n) {
     if (n<=0)
                throw new IllegalArgumentException("n must be positive");
     if ((n & -n) == n)  // i.e., n is a power of 2
         return (int)((n * (long)next(31)) >> 31);
     int bits, val;
     do {
         bits = next(31);
         val = bits % n;
     } while(bits - val + (n-1) < 0);
     return val;
  }
前面的描述中使用了不确定的词“大致”,因为 next 方法只是一个大致上独自选择位的无偏源。如果它是一个随机选择位的最佳源,那么给出的算法应该从规定范围完全一致地选择 int 值。
该算法稍微有些复杂。它拒绝那些会导致不均匀分布的值(由于 2^31 无法被 n 整除)。某个值被拒绝的概率取决于 n。最坏的情况是 n=2^30+1,拒绝的概率是 1/2,循环终止前的预计迭代次数是 2。

该算法特别对待 n 是 2 的次幂的情况:它从底层伪随机数生成器中返回正确的高位数。在不是特殊处理的情况中,将返回正确的低 位数。众所周知,线性同余伪随机数生成器(比如此类所实现的)在其低位的值序列中周期较短。因此,如果 n 是 2 的次幂(幂值较小),则这种特殊情况将大大增加此方法的后续调用所返回的值序列长度。
参数:
n - 要返回的随机数的范围。必须为正数。
返回:
下一个伪随机数,在此随机数生成器序列中 0(包括)和 n(不包括)之间均匀分布的 int 值
回复 使用道具 举报
  1. import java.util.Random;

  2. public class B {
  3. private static Random rnd = new Random();
  4.     public static void main(String[] args)throws Exception {
  5.      StringBuffer word = null;
  6.         switch(rnd.nextInt(3)) {
  7.             case 1:  word = new StringBuffer("a");break;
  8.             case 2:  word = new StringBuffer("b");break;
  9.             default: word = new StringBuffer("c");break;
  10.         }
  11.         word.append('d');
  12.         word.append('e');
  13.         word.append('f');
  14.         System.out.println(word);
  15.    
  16. }
  17. }
复制代码
帮你改了一下,注意switch  后面要加break;
回复 使用道具 举报
本帖最后由 杜俊彪 于 2012-6-3 18:58 编辑

楼主的问题好玄哦,   又看看二楼上的回答,我都快疯了; 经过查看API找到了一点点线索; 这里不是少     break;语句,   而是word=new StringBuffer(char) ;  这里出了点问题,  
API里有 StringBuffer(CharSequence seq)这个构造方法;   再点击CharSepuence 进去一看,说:CharSequence 是 char 值的一个可读序列。此接口对许多不同种类的 char 序列提供统一的只读访问;是在字符串生成器的初始容量为 16 加上 CharSequence 参数的长度        你完全可以把那些Random和Switch的代码去掉,    只执行一句word = new StringBuffer('a') ; System.out.println(word) ;  没有输出值;           


总结一下:   你用错了构造方法;   StringBuffer(CharSequence seq)这个构造方法是在字符串生成器的初始容量为 16 加上 CharSequence 参数的长度 ;  

楼主发现的问题好,   又学习了!!!!   

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 胡团乐 于 2012-6-3 18:51 编辑

你可以看下StringBuffer的构造方法 有个个构造方法StringBuffer(String str) 看好是字符串 不是字符啊

case 1:  word = new StringBuffer("a"); break;   //把'a'改成"a"
case 2:  word = new StringBuffer("b");break;   //把'b'改成"b"
default: word = new StringBuffer("c");break;   //把'c'改成"c"
这样应该没问题了,还有最好后面加上break;

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
板凳下兄真是厉害,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马