Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 676|回复: 0

抛硬币与掷骰子

[复制链接]

该用户从未签到

发表于 2011-9-13 14:40:13 | 显示全部楼层 |阅读模式
1.模拟抛硬币过程
首先,试图使用java模拟一个抛硬币的过程。过程是使用一个随机函数随机的产生正与反,然后进行统计。
Coin.java
package zj.code.fun1;
import java.util.Random;
public class Coin {
    private int negative=0;
    private int positive=0;
    private int turn;
   
    public Coin(int turn){
       this.turn=turn;
    }
   
    public void tossing(){
       Random rand=new Random();
       for(int i=0;i<turn;i++){
           getResult(rand.nextInt(2));
       }
       showResults();
    }
   
    public void getResult(int i){
       if(i==0)
           negative++;
       else if(i==1)
           positive++;
       else
           System.err.println("Wrong result.");
    }
   
    public void showResults(){
       System.out.println(&quotlay 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) {
       Coin co=new Coin(200);
        co.tossing();
    }
}

成员变量negitivepositve分别统计出现正反的次数,turn表示模拟的轮次。方法tossing()里面包含一个随机数01产生的过程,并将结果交给方法getResult()处理用于统计。最后通过方法showResults()可以显示统计结果。
下面做个测试,main()方法中通过抛200次,可以得到类似结果,
Play turns:200
Get negative:105,52.499996%
Get positive:95,47.5%

2.过程提炼与抽象
上面的代码可以很好的模拟抛硬币的场景,但太过于具体,我试图将其抽象化。
首先对于一个随机过程的演示,我想到它应该做3件事情,1提供随机产生器;2进行过程演示;3输出结果。我把它定义到一个接口中。
Randomer.java  <<interface>>
package zj.code.fun2;
public interface Randomer {
    public Seeder getSeed();
   
    public void runToss();
   
    public void showResults();
}

而设想针对抛硬币的过程,我使用一个抽象类先部分给出设定随机数产生器与轮次的概念。当然对于过程演示(runToss)与输出结果(showResults)是具体应用的东西,先不作考虑,继续抽象它。
Tosser.java <<abstract class>>
package zj.code.fun2;
public abstract class Tosser implements Randomer{
    protected Seeder curSeed;
    protected int turn;
    public Tosser(Seeder seed,int turn){
       curSeed=seed;
       this.turn=turn;
    }
   
    public Seeder getSeed() {
       return curSeed;
    }
    public void changeSeed(Seeder curSeed) {
       this.curSeed = curSeed;
    }
   
    public abstract void runToss();
   
    public abstract void showResults();
}

好了,现在试图提供一个随机数产生器,这个产生器设定为基于均等机率产生整型数。产生数的范围range是可以通过具体应用设定的。
Seeder.java
package zj.code.fun2;
import java.util.Random;
public class Seeder {
    private int range;
    Random rand=new Random();
   
    public Seeder(int range){
       this.range=range;
    }
    public int getValue(){
       return rand.nextInt(range);
    }
}

3.抛硬币与掷骰子
现在我用上面的结构,再次设计一个抛硬币的过程。它会继承抽象类Tosser
Coin.java
package zj.code.fun2;
public class Coin extends Tosser{
    private int negative=0;
    private int positive=0;
   
    public Coin(int turn) {
       super(new Seeder(2), turn);
    }
    @Override
    public void runToss() {
       for(int i=0;i<turn;i++){
           int v=curSeed.getValue();
           if(v==0)
              negative++;
           else if(v==1)
              positive++;
           else
              System.err.println("Wrong result.");
       }
    }
    @Override
    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) {
       Coin co=new Coin(200);
       co.runToss();
       co.showResults();
    }
}

在构造子中,我设定了随机数构造器的range=2。并将runToss()与showResults()的具体逻辑补充完。在main()方法中,再次进行测试,轮次还是200。可以得到类似的结果为,
Play turns:200
Get negative:99,49.5%
Get positive:101,50.5%

有了上面的结构,我不但可以抛硬币,我还可以掷骰子。
Dice.java
package zj.code.fun2;
public class Dice extends Tosser{
    private int ONE=0;
    private int TWO=0;
    private int THREE=0;
    private int FOUR=0;
    private int FIVE=0;
    private int SIX=0;
    public Dice(int turn) {
       super(new Seeder(6), turn);
    }
    @Override
    public void runToss() {
       for (int i = 0; i < turn; i++) {
           int v = curSeed.getValue();
           switch (v) {
           case 0:
              ONE++;
              break;
           case 1:
              TWO++;
              break;
           case 2:
              THREE++;
              break;
           case 3:
              FOUR++;
              break;
           case 4:
              FIVE++;
              break;
           case 5:
              SIX++;
              break;
           default:
              System.err.println("Wrong result.");
           }
       }
    }
    @Override
    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) {
       Dice di=new Dice(200);
       di.runToss();
       di.showResults();
    }
}

同样设定轮次为200,可以得到类似的测试结果,
Play turns:200
Get ONE:32,16.0%
Get TWO:29,14.5%
Get THREE:36,18.0%
Get FOUR:36,18.0%
Get FIVE:24,12.0%
Get SIX:43,21.5%

4. 既抛硬币又掷骰子
现在既要抛硬币又要掷骰子,我在抽象基类Tosser中增加一个Simple Factory
Tosser.java <<abstract class>>
。。。
public final static Randomer getTosserInstance(String type, int turn) {
    if (type.equalsIgnoreCase("coin"))
       return new Coin(turn);
    else if (type.equalsIgnoreCase("dice"))
       return new Dice(turn);
    else {
       System.err.println("Wrong Type.");
       return null;
    }
}
。。。

下面写一个测试类。
TosserTest.java
package zj.code.fun2;
public class TosserTest {
    public static void main(String[] args) {
       Randomer rand=Tosser.getTosserInstance("coin", 100);
       rand.runToss();
       rand.showResults();
       System.out.println("==================");
       rand=Tosser.getTosserInstance("dice", 100);
       rand.runToss();
       rand.showResults();
    }
}

既抛硬币又掷骰子,轮次都为100,可以得到类似测试结果为,
Play turns:100
Get negative:52,52.0%
Get positive:48,48.0%
==================
Play turns:100
Get ONE:17,17.0%
Get TWO:20,20.0%
Get THREE:17,17.0%
Get FOUR:18,18.0%
Get FIVE:12,12.0%
Get SIX:16,16.0%
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-5 08:32 , Processed in 0.483075 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表