| 
 | 
 
| 
 
 1.模拟抛硬币过程 
首先,试图使用java模拟一个抛硬币的过程。过程是使用一个随机函数随机的产生正与反,然后进行统计。 
Coin.java 
       Random rand=new Random();        for(int i=0;i<turn;i++){            getResult(rand.nextInt(2));     public void getResult(int i){            System.err.println("Wrong result.");     public void showResults(){        System.out.println(" lay turns:"+turn);        System.out.println("Get negative:"+negative+","               +(float)negative/(float)turn*100+"%");        System.out.println("Get positive:"+positive+","               +(float)positive/(float)turn*100+"%");     public static void main(String[] args) {  |  
  
成员变量negitive与positve分别统计出现正反的次数,turn表示模拟的轮次。方法tossing()里面包含一个随机数0,1产生的过程,并将结果交给方法getResult()处理用于统计。最后通过方法showResults()可以显示统计结果。 
下面做个测试,main()方法中通过抛200次,可以得到类似结果, 
Get negative:105,52.499996%  Get positive:95,47.5% 
 |  
  
2.过程提炼与抽象 
上面的代码可以很好的模拟抛硬币的场景,但太过于具体,我试图将其抽象化。 
首先对于一个随机过程的演示,我想到它应该做3件事情,1提供随机产生器;2进行过程演示;3输出结果。我把它定义到一个接口中。 
Randomer.java  <<interface>> 
public interface Randomer {     public void showResults();  } 
 |  
  
而设想针对抛硬币的过程,我使用一个抽象类先部分给出设定随机数产生器与轮次的概念。当然对于过程演示(runToss)与输出结果(showResults)是具体应用的东西,先不作考虑,继续抽象它。 
Tosser.java <<abstract class>> 
public abstract class Tosser implements Randomer{     protected Seeder curSeed;     public Tosser(Seeder seed,int turn){     public Seeder getSeed() {     public void changeSeed(Seeder curSeed) {     public abstract void runToss();     public abstract void showResults();  |  
  
好了,现在试图提供一个随机数产生器,这个产生器设定为基于均等机率产生整型数。产生数的范围range是可以通过具体应用设定的。 
Seeder.java 
    Random rand=new Random();     public Seeder(int range){        return rand.nextInt(range);  |  
  
3.抛硬币与掷骰子 
现在我用上面的结构,再次设计一个抛硬币的过程。它会继承抽象类Tosser。 
Coin.java 
public class Coin extends Tosser{        super(new Seeder(2), turn);        for(int i=0;i<turn;i++){            int v=curSeed.getValue();               System.err.println("Wrong result.");     public void showResults() {        System.out.println("Play turns:"+turn);        System.out.println("Get negative:"+negative+","               +(float)negative/(float)turn*100+"%");        System.out.println("Get positive:"+positive+","               +(float)positive/(float)turn*100+"%");     public static void main(String[] args) {  } 
 |  
  
在构造子中,我设定了随机数构造器的range=2。并将runToss()与showResults()的具体逻辑补充完。在main()方法中,再次进行测试,轮次还是200。可以得到类似的结果为, 
 
有了上面的结构,我不但可以抛硬币,我还可以掷骰子。 
Dice.java 
public class Dice extends Tosser{        super(new Seeder(6), turn);        for (int i = 0; i < turn; i++) {            int v = curSeed.getValue();               System.err.println("Wrong result.");     public void showResults() {        System.out.println("Play turns:"+turn);        System.out.println("Get ONE:"+ONE+","               +(float)ONE/(float)turn*100+"%");        System.out.println("Get TWO:"+TWO+","               +(float)TWO/(float)turn*100+"%");        System.out.println("Get THREE:"+THREE+","               +(float)THREE/(float)turn*100+"%");        System.out.println("Get FOUR:"+FOUR+","               +(float)FOUR/(float)turn*100+"%");        System.out.println("Get FIVE:"+FIVE+","               +(float)FIVE/(float)turn*100+"%");        System.out.println("Get SIX:"+SIX+","               +(float)SIX/(float)turn*100+"%");     public static void main(String[] args) {  |  
  
同样设定轮次为200,可以得到类似的测试结果, 
 
4. 既抛硬币又掷骰子 
现在既要抛硬币又要掷骰子,我在抽象基类Tosser中增加一个Simple Factory。 
Tosser.java <<abstract class>> 
。。。 
public final static Randomer getTosserInstance(String type, int turn) {     if (type.equalsIgnoreCase("coin"))     else if (type.equalsIgnoreCase("dice"))        System.err.println("Wrong Type.");  } 
。。。 
 |  
  
下面写一个测试类。 
TosserTest.java 
public class TosserTest {     public static void main(String[] args) {        Randomer rand=Tosser.getTosserInstance("coin", 100);        System.out.println("==================");        rand=Tosser.getTosserInstance("dice", 100);  } 
 |  
  
既抛硬币又掷骰子,轮次都为100,可以得到类似测试结果为, 
 |   
 
 
 
 |