【问题标题】:Simulation for the rolling of dice with the calculation of sums, frequencies and, percentages通过计算总和、频率和百分比来模拟掷骰子
【发布时间】:2017-01-27 10:53:31
【问题描述】:

我无法计算出一对骰子掷出的总和的频率。我被告知我必须使用一维整数数组来计算每个可能的总和出现在 36000 卷中的次数。我不确定我应该做什么,因为我们刚刚开始检查数组。这是说明的链接:http://s65.photobucket.com/user/jls7884/media/DicePic-page-001_zpsd45d977f.jpg.html?filters[user]=139936213&filters[recent]=1&sort=1&o=0

这是我目前的代码:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Dice;

/**
 *
 * @author Jacob
 */
import java.util.Random;
public class Dice 
{
public static void count1 ()
{
    int count;

    int frequency[] = new int[7];
    frequency[1] = 2;

    count = 1;
    while (count <= 6)
    {
        frequency[count] = count + 1;
        count++;
    }

    System.out.printf 
    (
    "%-2d %-2d %-2d %-2d %-2d %-2d \n"
    , frequency [1] , frequency [2] , frequency [3] , frequency [4] , frequency [5] , frequency [6]       
    );
}

public static void count2 ()
{
    int count;

    int frequency[] = new int[8];
    frequency[1] = 3;

    count = 1;
    while (count <= 6)
    {
        frequency[count] = count + 2;
        count++;
    }

    System.out.printf 
    (
    "%-2d %-2d %-2d %-2d %-2d %-2d \n"
    , frequency [1] , frequency [2] , frequency [3] , frequency [4] , frequency [5] , frequency [6]       
    );
}

public static void count3 ()
{
    int count;

    int frequency[] = new int[7];
    frequency[1] = 4;

    count = 1;
    while (count <= 6)
    {
        frequency[count] = count + 3;
        count++;
    }

    System.out.printf 
    (
    "%-2d %-2d %-2d %-2d %-2d %-2d \n"
    , frequency [1] , frequency [2] , frequency [3] , frequency [4] , frequency [5] , frequency [6]       
    );
}

public static void count4 ()
{
    int count;

    int frequency[] = new int[7];
    frequency[1] = 5;

    count = 1;
    while (count <= 6)
    {
        frequency[count] = count + 4;
        count++;
    }

    System.out.printf 
    (
    "%-2d %-2d %-2d %-2d %-2d %-2d \n"
    , frequency [1] , frequency [2] , frequency [3] , frequency [4] , frequency [5] , frequency [6]       
    );
}

public static void count5 ()
{
    int count;

    int frequency[] = new int[7];
    frequency[1] = 6;

    count = 1;
    while (count <= 6)
    {
        frequency[count] = count + 5;
        count++;
    }

    System.out.printf 
    (
    "%-2d %-2d %-2d %-2d %-2d %-2d \n"
    , frequency [1] , frequency [2] , frequency [3] , frequency [4] , frequency [5] , frequency [6]       
    );
}

public static void count6 ()
{
    int count;

    int frequency[] = new int[7];
    frequency[1] = 7;

    count = 1;
    while (count <= 6)
    {
        frequency[count] = count + 6;
        count++;
    }

    System.out.printf 
    (
    "%-2d %-2d %-2d %-2d %-2d %-2d \n"
    , frequency [1] , frequency [2] , frequency [3] , frequency [4] , frequency [5] , frequency [6]       
    );
}

public static void main(String[] args)
{
    int num1 = 1;
    int num2 = 2;
    int num3 = 3;
    int num4 = 4;
    int num5 = 5;
    int num6 = 6;

    int num = 0;
    while (num < 7)
    {
        System.out.printf ("%-3d", num++);
    }

    System.out.println ();
    System.out.printf ("%d: ", num1);
    Dice.count1 ();
    System.out.printf ("%d: ", num2);
    Dice.count2 ();
    System.out.printf ("%d: ", num3);
    Dice.count3 ();
    System.out.printf ("%d: ", num4);
    Dice.count4 ();
    System.out.printf ("%d: ", num5);
    Dice.count5 ();
    System.out.printf ("%d: ", num6);
    Dice.count6 ();

    String sumStr = "Sum";
    String frequencyStr = "Frequency";
    String percentageStr = "Percentage";
    System.out.printf ("%-5s %-12s %s", sumStr, frequencyStr, percentageStr);
    System.out.println ();

    Random rollDie = new Random ();

    for (int i = 1; i <= 36000; i++)
    {
        int die1 = 1 + rollDie.nextInt ((6));
        int die2 = 1 + rollDie.nextInt ((6));

        int sum = die1 + die2;
    }

    int count = 2;
    while (count <= 12)
    {    
        int frequency = 1003;
        double minusFrequency = 36000 - frequency;
        double divideTotal = minusFrequency / 36000;
        double percentageTotal = divideTotal * 100;
        double calculatePercentage = 100 - percentageTotal;
        double percentage = calculatePercentage;

        int sumCount = count++;
        System.out.printf ("%3d %11d %12.1f%% \n",sumCount, frequency, percentage);
    }
}

}

任何帮助将不胜感激。

谢谢,雅各布

【问题讨论】:

    标签: java arrays dice


    【解决方案1】:

    你会如何在纸上做到这一点?

    您可以将一张纸分成 12 列(一列代表 1,一列代表 2,以此类推,直到 12 列)。然后,您将掷骰子 3600 次,每次得到 7,例如,您将在第 7 列中添加一个标记。然后您将计算每列中的标记,并将总和除以 3600 得到它们频率。

    只需在 Java 中做同样的事情:有一个由 12 个元素组成的 int[] counts 数组。然后做一个从 0 到 3600 的循环。在每次迭代中,掷骰子,并根据你得到的值递增数组元素。因此,例如,如果你得到第 7 个,你将增加数组的第 7 个元素。

    【讨论】:

      【解决方案2】:

      也许说明要求您创建所有单独的方法,但我个人会将其编码如下。这将填充您的数组,然后您可以使用它来计算/打印使用 for 循环询问的任何内容。例如,如果您想计算总和 2 在 36,000 次滚动中滚动的百分比,您可以这样做: double percent = frequency[0]/36000;

      Random ranNum = new Random();
      int[] frequencies = new int[11];
      int face1;
      int face2;
      int sum;
      
      Arrays.fill(frequencies, 0);
      
      for(int count = 1; count <= 36000; count++)
      {
        face1 = 1+randomNumbers.nextInt(6);
        face2 = 1+randomNumbers.nextInt(6);
        sum = face1 + face2;
      
        switch(sum)
        {
          case 2: frequencies[0] += 1;
          break;
          case 3: frequencies[1] += 1;
          break;
          case 4: frequencies[2] += 1;
          break;
          case 5: frequencies[3] += 1;
          break;
          case 6: frequencies[4] += 1;
          break;
          case 7: frequencies[5] += 1;
          break;
          case 8: frequencies[6] += 1;
          break;
          case 9: frequencies[7] += 1;
          break;
          case 10: frequencies[8] += 1;
          break;
          case 11: frequencies[9] += 1;
          break;
          case 12: frequencies[10] += 1;
          break;
        }
      }
      

      【讨论】:

      • switch语句可以替换为frequencies[sum-2] += 1;
      • 我试图实现您的方法,但是在对等式进行编码以计算百分比时,它会打印多个全为 0 的值。我通过为其中一个数组元素添加打印语句来测试您的方法,它产生了我认为是 36000 个不同的值。
      • 我很困惑为什么我会得到 36000 个不同的值。我需要做的就是计算每个总和出现的次数,我假设每次都不同。
      • 我可以在掷骰子时使用包含可能组合的硬编码数组来计算频率和百分比。数组将像这样声明和启动: int[] intArray = {2, 3, 4, 5, 6, 7, 3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 11, 7, 8, 9, 10, 11, 12};
      • 数组只需要 12 个元素 (0-11)。每个可能的骰子组合有 1 个元素(2、3、4、5、6、7、8、9、10、11、12)。然后开关将使用 sum 变量的值(face1 和 face2 的总和)将 1(使用“+= 1”)添加到适当的元素,以便每次 a 值被“滚动”时保持计数骰子。
      【解决方案3】:

      我有一个朋友在课堂上帮助我。我为我以前的 cmets 道歉。我没有仔细阅读代码以理解它在做什么。通过查看您的代码和 JB nizet 的逻辑,我现在了解到的是,switch 语句采用与数组的每个元素相对应的总和值,并根据找到的相应总和值的数量而增加。我最初在 for 循环和 print 语句中声明并初始化了数组,因此我得到了 36000 个值。然后我将我的数组声明和赋值移到循环之外,这样我就可以在整个程序中使用它,然后我修复了我的 while 循环从 [0, 10] 开始并添加两个来计数以获得可能的总和values [2, 12] 然后通过将 count 的值传递给频率数组来打印出频率。在编写公式来计算百分比时,我遇到了将 0.0% 作为百分比值的问题。我可以通过将整数数组转换为双精度来解决这个问题。作为参考,这是我最终得到的代码和相应输出的示例:

      代码:

      import java.util.Arrays;
      import java.util.Random;
      public class Dice 
      {
      public static void main(String[] args)
      {
          String sumStr = "Sum";
          String frequencyStr = "Frequency";
          String percentageStr = "Percentage";
          System.out.printf ("%-5s %-12s %s", sumStr, frequencyStr, percentageStr);
          System.out.println ();
      
          Random rollDie = new Random ();
      
          int frequencies[] = new int [11];
      
          Arrays.fill(frequencies, 0);
      
          for (int i = 1; i <= 36000; i++)
          {
              int die1 = rollDie.nextInt (6) + 1;
              int die2 = rollDie.nextInt (6) + 1;
      
              int sum = die1 + die2;
      
              switch (sum)
              {
                  case 2: frequencies[0]++;
                  break;
      
                  case 3: frequencies[1]++;
                  break;
      
                  case 4: frequencies[2]++;
                  break;
      
                  case 5: frequencies[3]++;
                  break;
      
                  case 6: frequencies[4]++;
                  break;
      
                  case 7: frequencies[5]++;
                  break;
      
                  case 8: frequencies[6]++;
                  break;
      
                  case 9: frequencies[7]++;
                  break;
      
                  case 10: frequencies[8]++;
                  break;
      
                  case 11: frequencies[9]++;
                  break;
      
                  case 12: frequencies[10]++;
                  break;
      
                  default:
                  break;
              } 
          }
      
          int count = 0;
          while (count <= 10)
          {    
              double percentage = ((double) frequencies[count] / 36000) * 100;
      
              System.out.printf ("%3d %11d %12.1f%% \n",count + 2, frequencies[count], percentage);
              int sumCount = count++;
              }
          }
      }
      

      输出:

      Sum   Frequency    Percentage
        2        1013          2.8% 
        3        1953          5.4% 
        4        2997          8.3% 
        5        4012         11.1% 
        6        5015         13.9% 
        7        6093         16.9% 
        8        4966         13.8% 
        9        3999         11.1% 
       10        3024          8.4% 
       11        1944          5.4% 
       12         984          2.7% 
      

      【讨论】:

        猜你喜欢
        • 2011-01-19
        • 1970-01-01
        • 2011-07-12
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        • 2018-01-03
        相关资源
        最近更新 更多