5

私の割り当てでは、単純なバージョンの Craps を作成する必要があります。何らかの理由で、両方の変数が 0 でない場合でも、割合の割り当ては常に 0 を生成します。コードは次のとおりです。

import java.util.Random;

ヘッダー、変数に注意してください

public class Craps {
private int die1, die2,myRoll ,myBet,point,myWins,myLosses;
private double winPercent,lossPercent;
private Random r = new Random();

2 つのサイコロを振って、それぞれのサイコロを出すだけです。

public int roll(){
    die1 = r.nextInt(6)+1;
    die2 = r.nextInt(6)+1;
    return(die1 + die2);
}

Play メソッド、これはゲームをループするだけです。

public void play(){
    myRoll = roll();
    point = 0;

    if(myRoll == 2 ||myRoll == 3 || myRoll == 12){
        System.out.println("You lose!");
        myLosses++;
    }else if(myRoll == 7 || myRoll == 11){
        System.out.println("You win!");
        myWins++;
    }else{
        point = myRoll;
        do {
            myRoll = roll();
        }while(myRoll != 7 && myRoll != point);
        if(myRoll == point){
            System.out.println("You win!");
            myWins++;
        }else{
            System.out.println("You lose!");
            myLosses++;
        }
    }
}

これがバグの場所です。これがテスター メソッドです。

public void tester(int howMany){
    int i = 0;
    while(i < howMany){
        play();
        i++;
    }

バグはこれらの割り当てステートメントにあります

    winPercent = myWins/i * 100;
    lossPercent = myLosses/i* 100;
    System.out.println("program ran "+i+" times "+winPercent+"% wins "+ lossPercent+"% losses with "+myWins+" wins and "+myLosses+" losses");



}

}

4

4 に答える 4

16

おそらく、整数除算を行っており、分母が分子よりも大きいためです。したがって、値はゼロになります。

この割り当てを変更できます: -

winPercent = myWins/i * 100;
lossPercent = myLosses/i* 100;

に: -

winPercent = myWins * 100.0/i;
lossPercent = myLosses * 100.0/i;

考慮すべき点が 2 つあります。

  • 分子を次のようにキャストして、除算を除算の浮動小数点にするかfloat: -

    winPercent = (float)(myWins)/i * 100;
    
  • また、整数除算の場合は、結合性優先順位の問題です。*との優先順位/同じで、左から右への結合性があります。そのため、myWins / i最初に評価されます。したがって、その値が 0 になる可能性は十分にあります。

    したがって、 と の順序を変更し*/*最初に実現させてください。

注、私は100.0乗算で使用しました。を掛ける100と再びTruncationになるためです。

于 2012-11-12T04:53:02.837 に答える
3

を見てみましょう

  winPercent = myWins/i * 100;
  lossPercent = myLosses/i* 100;

とはすべて整数であるためmyWins、Java は整数演算を使用して結果を返します。以来、 の結果は常に 0 または 1 になります。myLossesimyWins <= imyWins / i

これは、次のようなさまざまな方法で修正できます。

   winPercent = (1.0f * myWins / i) * 100;
于 2012-11-12T04:55:32.940 に答える