使用RandomGenerator翻转硬币

时间:2013-06-19 11:20:39

标签: java

我正在尝试编写一个模拟翻转硬币的程序。硬币第一次翻转我希望程序退出。我的while循环中的第一个语句翻转了一次硬币。然后我有一个if语句,说明我刚刚翻转的硬币是否退出程序。但我的计划并没有按照我想要的方式运作。有时候

我的问题是我在while循环中每1个周期翻一次或两次硬币吗?硬币是否在while循环中翻转一次,然后在if条件下第二次翻转?我已经测试了它,但它每次都给出了不同错误的不同结果,我无法弄清楚原因。

if条件对于我在程序中尝试做的是否正确?

import acm.program.*;
import acm.util.*;

public class CoinToss extends ConsoleProgram{
public void run(){


     while (true){
        println(flipCoin());
        if (flipCoin() == "heads"){
               break;
             }   
        }
  }

public String flipCoin(){
   String flip = rgen.nextBoolean() ? "heads" : "tails"; 
   return flip;
 }


public RandomGenerator rgen = RandomGenerator.getInstance();
}

3 个答案:

答案 0 :(得分:5)

每次拨打flipCoin()时,该方法都会运行,因此它会在println(flipCoin());行上运行一次,在if (flipCoin() == "heads")上运行一次。两个调用的结果可能不一样,您应该存储结果然后使用结果,所以:

    while (true){
        String result=flipCoin();
        System.out.println(result);
        if (result.equals("heads")){
            break;
        }   
    }

另请注意,使用== with strings(在大多数情况下)总是会给出false;这是因为==询问它们是否真的是同一个对象,而不是它们的内容是否相等(两张纸都可以写上“hi”,但它们不是同一张纸)。 .equals比较两个字符串的内容(即如果他们说同一个字)。

我尽可能接近您的代码保留我的修改,但您可能需要考虑以下可能的改进:

  • break;可以拥有合法用法但通常是不必要的,您可以通过以下方式避免使用:

    String result=flipCoin();
    while (result.equals("heads")==false){
        System.out.println(result);
        result=flipCoin();
    
    }
    
  • 再次使用字符串作为标识符有其位置,但考虑到您可以使用的所有不同的资本化(head,Heads,HEADS),枚举可能是更好的选择。

答案 1 :(得分:3)

不,这是错的。您的代码目前正在翻转硬币,打印该值,然后翻转另一枚硬币以测试退出。问题在于,如果你连续翻转两个线圈,你不一定总会得到相同的结果。

更好的方法:

for(;;)
    if(rgen.nextBoolean()) {
        println("heads");
        break;
    } else
        println("tails");

您不需要单独的方法来实际翻转硬币,因为该方法已经存在,称为rgen.nextBoolean()。让方法返回一个字符串,然后处理字符串,是非常低效的。虽然效率对此无关紧要,但不要养成做这样的事情的坏习惯,否则可能会在以后咬你。

编辑:在回应一些评论时,这是一种更通用的,面向对象的方式:

public enum CoinFlipResult {
    HEADS, TAILS;
    @Override
    public String toString(){ 
        switch(this){
        case HEADS: return "heads"; break;
        case TAILS: return "tails"; break;
        }
    } //could have just done `name().toLowerCase()`, but I like this better
}

public CoinFlipResult flipCoin(){
    if(rgen.nextBoolean())
        return CoinFlipResult.HEADS;
    else
        return CoinFlipResult.TAILS;
}

@Override
public void run(){
    CoinFlipResult flip;
    do {
        flip = flipCoin();
        println(flip);
    } while(flip != CoinFlipResult.HEADS)
}

答案 2 :(得分:3)

我不喜欢不必要的break不要将字符串与== 进行比较:

String result = null;
do {
    result = flipCoin()
    println(result);
} while (!"tails".equals(result));

我建议为“head”和“tails”引入String常量