/**
 * 
 *//**
 * @author Administrator
 *
 */
import static myutil.Print.*;
import java.util.*;
interface Cantoss{
void toss();
}interface CantossFactory {
Cantoss get();
}class Dice implements Cantoss{
private static  final Random rand=new Random(48);
public void toss(){
printnb(rand.nextInt(6)+1+" ");
}
}class DiceFactory implements CantossFactory{
public Cantoss get(){
return new Dice();
}
}
public class Ex19 { /**
 * @param args
 */
public static void playToss(CantossFactory ctf){
ctf.get().toss();
}
public static void main(String[] args) {
// TODO Auto-generated method stub

for(int ii=0;ii<10;ii++)
playToss(new DiceFactory()); //play 10 times
}}当我把private static  final Random rand=new Random(48);语句去掉static后产出的数字就都是3,每次运行都是三,请问这是为什么呢,谢谢

解决方案 »

  1.   

    private static  final Random rand=new Random(48);
      

  2.   

    LZ可以去看一下Random的API
    如果去掉static 每个Dice 维护它自己的一个final的Random rand,这些rand的种子都是一样的,而且都是进行rand.nextInt(6),所以结果是相同的,都是3;
    如果加上static那么所有的Dice都使用同一个Random rand,所以进行rand.nextInt(6),结果就是正确的了
      

  3.   

    class Dice implements Cantoss{
        Random rand=new Random();
        public void toss(){
            System.out.println(rand.nextInt(6)+1+" ");
        }
    }构造方法里放了个48  
    空的Random(),实际上插入了一个当前时间作为种子
    import java.util.*;
    public class Ex19 {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
              Random r=new Random(48);
            for(int ii=0;ii<20;ii++){
            
             System.out.print (r.nextInt(6)+" ");
            }
            
        }}
      

  4.   

    static的作用好好理解下(内存中只有一份拷贝,无法改变)
      

  5.   

    static, 在加载类的时候就生成了,存在了栈内存里了,你说还会不会改变呢?呵呵!