【问题标题】:Coin toss class returning the same side up everytime抛硬币课每次都返回相同的一面
【发布时间】:2013-11-18 22:07:01
【问题描述】:

我需要帮助。我应该抛硬币 40 次,每次都是正面和反面,但由于某种原因,它总是返回全部正面或全部反面,我不知道为什么。我得到了一个我必须遵循的 UML 图。它需要一个名为 sideUp 的私有 String、一个名为 Coin 的公共无参数构造函数、一个名为 toss 的公共 void 方法和一个名为 getSideUp 的 String 方法。

硬币类:

import java.util.*;
public class Coin {
private String sideUp;

public Coin(){
    toss();
}

public void toss(){
    Random myRand = new Random();
    int face = myRand.nextInt(2);
    if(face == 0){
        sideUp = "heads";
    }
    else{
        sideUp = "tails";
    }
    getSideUp();
}
public String getSideUp(){
    return sideUp;

}
}

CoinDriver:

public class CoinDriver {
public static void main(String[] args){
    Coin coin = new Coin();
    int headsCount = 0;
    int tailsCount = 0;
    for(int i = 1; i <= 40; i++){
        System.out.println(coin.getSideUp());
        if(coin.getSideUp().equals("heads")){
            headsCount++;
        }
        else if(coin.getSideUp().equals("tails")){
            tailsCount++;
        }
    }
    System.out.println("Total number of heads: " + headsCount + "\nTotal number of tails: " + tailsCount);
}
}

【问题讨论】:

  • 那个硬币可能已经装好了 ;)

标签: java random


【解决方案1】:

你只在构造函数中调用toss(),所以一旦它被创建就不会改变它。

for 循环中的Coin 上调用toss() 以获得新结果。

【讨论】:

  • 问题是 toss() 是一个 void 类型的方法,你不能使用它。
  • 当然,toss() 返回void,但您已经在for 循环中调用getSideUp(),只需在此之前插入对toss() 的调用。 (而且您不需要从 toss() 调用 getSideUp();这没有任何用处。)
  • ohhhh 好的,谢谢,谢谢,谢谢!这完美无缺。
【解决方案2】:

您需要确保每次在 CoinDriver 中迭代 for 循环的主体时都重新投掷硬币。试试这些:

import java.util.*;
public class Coin {

  public String toss() {
    Random myRand = new Random();
    int face = myRand.nextInt(2);
    if (face == 0) {
      return "heads";
    } else{
      return "tails";
    }       
  } 
}

public class CoinDriver {

  public static void main(String[] args){
    Coin coin = new Coin();
    int headsCount = 0;
    int tailsCount = 0;
    for(int i = 1; i <= 40; i++) {

      if (coin.toss().equals("heads")) {
        headsCount++;
      } else {
        tailsCount++;
      }
    }
    System.out.println("Total number of heads: " + headsCount + "\nTotal number of tails: " + tailsCount);
  }
}

【讨论】:

  • 你最好在每次投掷时重复使用相同的 Random 对象。 Random 的默认构造函数使用系统时钟生成初始种子;保证在同一时钟滴答内创建的两个 Random 对象返回相同的值序列。
  • 虽然这可行,但我得到了一个必须遵循的 UML 图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2020-01-28
  • 1970-01-01
  • 2020-09-30
  • 2016-01-24
  • 2012-05-28
相关资源
最近更新 更多