簡體   English   中英

這兩個類之間的邏輯區別是什么?

[英]What is the logical difference between these two classes?

我編寫了一個Java類來解決教科書Javanotes 7中的問題,該Javabook要求一個程序來顯示與在骰子上獲得給定值所需的擲骰數有關的統計信息。 據我所知,我的課沒有給我正確的統計數據,從邏輯上講,它與教科書中提供的解決方案相同。 顯然不是。 這是我的代碼:

/**
    This program rolls a pair of dice until they come up a certain value. It repeats this for a certain number of trials and then gives the user the average number of
    rolls required to achieve the target value. It does this for each possible value of two six-sided dice. It also gives the standard deviation and the maximum
    number of rolls.
*/

public class DiceAverage{

    static final int SAMPLE_SIZE = 10000;

    public static void main(String[] args){

        System.out.println("Total on Dice    Average Number of Rolls    Standard Deviation    Maximum Number of Rolls");
        System.out.println("-------------    -----------------------    ------------------    -----------------------");

        //each dice value iterator
        for(int i = 2; i < 13; i ++){

            //for each value, create a Statcalc, and PairOfDice object
            StatCalc dataset = new StatCalc();
            PairOfDice dice = new PairOfDice();

            //each trial iterator
            for(int j = 0; j < SAMPLE_SIZE; j ++){

                int counter = 1;//counter for number of rolls. Initialized at 1 because dice object is rolled upon construction.

                //get die1 and die2
                while(dice.getDie1() + dice.getDie2() != i){

                    dice.roll();
                    counter ++;

                }

                dataset.enter(counter);

            }

            System.out.printf("      %-19d%-25.3f%-25.3f%1.3f%n", i, dataset.getMean(), dataset.getStandardDeviation(), dataset.getMax());

        }

    }

}

這是實際的解決方案:

/**This program performs the following type of experiment:
 * Given a desired total roll, such as 7, roll a pair of
 * dice until the given total comes up, and count how many
 * rolls are necessary.  Now do the experiment over and over,
 * and find the average number of rolls.  The number of times
 * the experiment is repeated is given by the constant,
 * NUMBER_OF_EXPERIMENTS.  Several statistics are computed and
 * printed out for each possible roll = 2, 3, ..., 12:
 * the average number of rolls, the standard deviation,
 * and the maximum number of rolls.
 */

public class DiceRollStats2 {

   static final int NUMBER_OF_EXPERIMENTS = 10000;

   private static PairOfDice dice = new PairOfDice();
            // A single pair of dice, which will be used for all
            // the experiments.


   public static void main(String[] args) {

       System.out.println("Dice Total   Avg # of Rolls   Stand. Deviation   Max # of Rolls");
       System.out.println("----------   --------------   ----------------   --------------");

       for ( int total = 2;  total <= 12;  total++ ) {
          StatCalc stats;  // An object that will compute the statistics.
          stats = new StatCalc();
          for ( int i = 0; i < NUMBER_OF_EXPERIMENTS; i++ ) {
                // Do the experiment of counting the number of rolls
                // required to roll the desired total, and enter the
                // number of rolls into stats' dataset.
             stats.enter( rollFor(total) );
          }
          System.out.printf("%6d", total);
          System.out.printf("%18.3f", stats.getMean());
          System.out.printf("%19.3f", stats.getStandardDeviation());
          System.out.printf("%14.3f", stats.getMax());
          System.out.println();
       }

   } // end main

   /**
    * Roll the dice repeatedly until the total on the
    * two dice comes up to be N.  N MUST be one of the numbers
    * 2, 3, ..., 12.  (If not, this routine will go into an
    * infinite loop!).  The number of rolls is returned.
    */
   static int rollFor( int N ) {
       int rollCt = 0;  // Number of rolls made.
       do {
          dice.roll();
          rollCt++;
       } while ( dice.getDie1() + dice.getDie2() != N );
       return rollCt;
   }


}  // end class DiceRollStats2

我看不出它們之間的邏輯差異。 它是什么?

您正在通過初始化int counter = 1;來計算1個額外的擲骰int counter = 1;

嘗試將其初始化為0。

int rollCt = 0;  // Number of rolls made.
   do {
      dice.roll();
      rollCt++;
   } while ( dice.getDie1() + dice.getDie2() != N );
   return rollCt;

在這里,骰子在do ... while循環中的布爾測試之前滾動。

int counter = 1;//counter for number of rolls. Initialized at 1 because dice object is rolled upon construction.

            //get die1 and die2
            while(dice.getDie1() + dice.getDie2() != i){

                dice.roll();
                counter ++;

            }

而這里的骰子是在布爾測試后滾動的。 因此,如果骰子變得等於i,骰子的值就不會被roll()改變(跳過while循環),並且您會通過for循環獲得一堆迭代,計數==1。基本上,骰子擲骰是這樣無法正確模擬。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM