|
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,可以得到类似测试结果为,
|
|