2012-10-12 565 views
1

我的assignment instructions是“滚动”2个骰子并获得总和,然后根据用户想要掷骰子的次数找出总和出现的概率。我必须使用嵌套循环,并且我不能为每个骰子组合使用单独的循环(我没有这样做)。我不能在这个任务中使用数组。(Java)使用嵌套循环

编写一个程序来模拟抛掷一对11面骰子,并确定每个可能的骰子组合掷骰子的百分比。

  1. 在Mod05 Assignments文件夹中创建一个名为5.05 Random Dice的新项目。
  2. 在新创建的项目文件夹中创建一个名为DiceProbability的类。
  3. 要求用户输入掷骰子的次数。
  4. 计算每个骰子组合的概率。 (您可能要开始更熟悉的六面骰子。)
  5. 打印结果整齐的两列

我需要找出什么,我投入的第二个“for”循环的帮助。对不起,杂乱的整数列表和if语句。代码未完成。

import java.util.Random; 
import java.util.Scanner; 
public class DiceProbability 
{ 
public static void main(String[] args) 
{ 
    Scanner in = new Scanner(System.in); 
    Random randNum = new Random(); 

    int count2 = 0; 
    int count3 = 0; 
    int count4 = 0; 
    int count5 = 0; 
    int count6 = 0; 
    int count7 = 0; 
    int count8 = 0; 
    int count9 = 0; 
    int count10 = 0; 
    int count11= 0; 
    int count12= 0; 
    int count13 = 0; 
    int count14 = 0; 
    int count15 = 0; 
    int count16 = 0; 
    int count17 = 0; 
    int count18 = 0; 
    int count19 = 0; 
    int count20 = 0; 
    int count21 = 0; 
    int count22 = 0; 
    int die1 = 0, die2 = 0; 
    int rolls = 0; 
    int actualDiceSum; 
    double probabilityOfDice = 0.0; 

    System.out.print("Number of Rolls: "); 
    rolls = in.nextInt(); 

    for(int timesRolled = 0; timesRolled < rolls; timesRolled++) 
     { 
     die1 = randNum.nextInt(12); 
     die2 = randNum.nextInt(12); 
     actualDiceSum = die1 + die2; 
     for() 
     { 
      if(actualDiceSum == 2){ 
      count2++; 
      probabilityOfDice = count2/rolls; 
      } 
      else if(actualDiceSum == 3){ 
      count3++; 
      probabilityOfDice = count3/rolls; 
      } 
      else if(actualDiceSum == 4){ 
      count4++; 
      probabilityOfDice = count4/rolls; 
      } 
      else if(actualDiceSum == 5){ 
      count5++; 
      probabilityOfDice = count5/rolls; 
      } 
      else if(actualDiceSum == 6){ 
      count6++; 
      probabilityOfDice = count6/rolls; 
      } 
      else if(actualDiceSum == 7){ 
      count7++; 
      probabilityOfDice = count7/rolls; 
      } 
      else if(actualDiceSum == 8){ 
      count8++; 
      probabilityOfDice = count8/rolls; 
      } 
      else if(actualDiceSum == 9){ 
      count9++; 
      probabilityOfDice = count9/rolls; 
      } 
      else if(actualDiceSum == 10){ 
      count10++; 
      probabilityOfDice = count10/rolls; 
      } 
      else if(actualDiceSum == 11){ 
      count11++; 
      probabilityOfDice = count11/rolls; 
      } 
      else if(actualDiceSum == 12){ 
      count12++; 
      probabilityOfDice = count12/rolls; 
      } 
      else if(actualDiceSum == 13){ 
      count13++; 
      probabilityOfDice = count13/rolls; 
      } 
      else if(actualDiceSum == 14){ 
      count14++; 
      probabilityOfDice = count14/rolls; 
      } 
      else if(actualDiceSum == 15){ 
      count15++; 
      probabilityOfDice = count15/rolls; 
      } 
      else if(actualDiceSum == 16){ 
      count16++; 
      probabilityOfDice = count16/rolls; 
      } 
      else if(actualDiceSum == 17){ 
      count17++; 
      probabilityOfDice = count17/rolls; 
      } 
      else if(actualDiceSum == 18){ 
      count18++; 
      probabilityOfDice = count18/rolls; 
      } 
      else if(actualDiceSum == 19){ 
      count19++; 
      probabilityOfDice = count19/rolls; 
      } 
      else if(actualDiceSum == 20){ 
      count20++; 
      probabilityOfDice = count20/rolls; 
      } 
      else if(actualDiceSum == 21){ 
      count21++; 
      probabilityOfDice = count21/rolls; 
      } 
      else if(actualDiceSum == 22){ 
      count22++; 
      probabilityOfDice = count22/rolls; 
      } 
     } 
    } 


    System.out.println("Sum of Dice \t\t Probability"); 
    System.out.println("2's\t\t" + probabilityOfDice + "%"); 
    System.out.println("3's\t\t" + probabilityOfDice + "%"); 
    System.out.println("4's\t\t" + probabilityOfDice + "%"); 
    System.out.println("5's\t\t" + probabilityOfDice + "%"); 
    System.out.println("6's\t\t" + probabilityOfDice + "%"); 
    System.out.println("7's\t\t" + probabilityOfDice + "%"); 
    System.out.println("8's\t\t" + probabilityOfDice + "%"); 
    System.out.println("9's\t\t" + probabilityOfDice + "%"); 
    System.out.println("10's\t\t" + probabilityOfDice + "%"); 
    System.out.println("11's\t\t" + probabilityOfDice + "%"); 
    System.out.println("12's\t\t" + probabilityOfDice + "%"); 
    System.out.println("13's\t\t" + probabilityOfDice + "%"); 
    System.out.println("14's\t\t" + probabilityOfDice + "%"); 
    System.out.println("15's\t\t" + probabilityOfDice + "%"); 
    System.out.println("16's\t\t" + probabilityOfDice + "%"); 
    System.out.println("17's\t\t" + probabilityOfDice + "%"); 
    System.out.println("18's\t\t" + probabilityOfDice + "%"); 
    System.out.println("19's\t\t" + probabilityOfDice + "%"); 
    System.out.println("20's\t\t" + probabilityOfDice + "%"); 
    System.out.println("21's\t\t" + probabilityOfDice + "%"); 
    System.out.println("22's\t\t" + probabilityOfDice + "%"); 
} 
} 
+1

究竟做你的代码做的,你在哪里打破你的内心'for'循环?看起来它永远都是。另外,在这种情况下,使用'switch ... case'语句而不是'if ... else if ... else'阶梯将更合适。 – Lion

+1

@Lion我只是想说。另外,你应该真的使用某种类型的数组系统或其他东西。所有这些计数变量都很疯狂。 – Austin

+0

说明:编写一个程序来模拟抛掷一对11面骰子,并确定掷骰子每个可能组合的次数百分比。 1.在Mod05 Assignments文件夹中创建一个名为5.05 Random Dice的新项目。 2.在新创建的项目 文件夹中创建一个名为DiceProbability的类。 3.要求用户输入掷骰子的次数。 4.计算每个骰子组合的概率。 (你可能想从 更熟悉的六面骰子开始。) 5.将结果整齐排列在两列 – user1713336

回答

0

那么根据我你不需要第二个循环。 每次掷骰子时,都要计算总数并根据总和增加计数。

您需要使用单独的变量来计算每个总和的概率。

例如

Probability of count2 = (count2/number of rolls); 
Probability of count3 = (count2/number of rolls); 

使用计数

的概率不同的变量试试这个代码

import java.util.Random; 
import java.util.Scanner; 
public class DiceProbability 
{ 
public static void main(String[] args) 
{ 
    Scanner in = new Scanner(System.in); 
    Random randNum = new Random(); 
int count2 = 0; 
int count3 = 0; 
int count4 = 0; 
int count5 = 0; 
int count6 = 0; 
int count7 = 0; 
int count8 = 0; 
int count9 = 0; 
int count10 = 0; 
int count11= 0; 
int count12= 0; 
int count13 = 0; 
int count14 = 0; 
int count15 = 0; 
int count16 = 0; 
int count17 = 0; 
int count18 = 0; 
int count19 = 0; 
int count20 = 0; 
int count21 = 0; 
int count22 = 0; 
int die1 = 0, die2 = 0; 
int rolls = 0; 
int actualDiceSum; 
double probabilityOfDice = 0.0; 

System.out.print("Number of Rolls: "); 
rolls = in.nextInt(); 

for(int timesRolled = 0; timesRolled < rolls; timesRolled++) 
    { 
    die1 = randNum.nextInt(12); 
    die2 = randNum.nextInt(12); 
    actualDiceSum = die1 + die2; 

     if(actualDiceSum == 2){ 
     count2++; 

     } 
     else if(actualDiceSum == 3){ 
     count3++; 

     } 
     else if(actualDiceSum == 4){ 
     count4++; 

     } 
     else if(actualDiceSum == 5){ 
     count5++; 

     } 
     else if(actualDiceSum == 6){ 
     count6++; 

     } 
     else if(actualDiceSum == 7){ 
     count7++; 

     } 
     else if(actualDiceSum == 8){ 
     count8++; 

     } 
     else if(actualDiceSum == 9){ 
     count9++; 

     } 
     else if(actualDiceSum == 10){ 
     count10++; 

     } 
     else if(actualDiceSum == 11){ 
     count11++; 

     } 
     else if(actualDiceSum == 12){ 
     count12++; 

     } 
     else if(actualDiceSum == 13){ 
     count13++; 

     } 
     else if(actualDiceSum == 14){ 
     count14++; 

     } 
     else if(actualDiceSum == 15){ 
     count15++; 

     } 
     else if(actualDiceSum == 16){ 
     count16++; 

     } 
     else if(actualDiceSum == 17){ 
     count17++; 

     } 
     else if(actualDiceSum == 18){ 
     count18++; 

     } 
     else if(actualDiceSum == 19){ 
     count19++; 

     } 
     else if(actualDiceSum == 20){ 
     count20++; 

     } 
     else if(actualDiceSum == 21){ 
     count21++; 

     } 
     else if(actualDiceSum == 22){ 
     count22++; 

     } 
    } 
} 


System.out.println("Sum of Dice \t\t Probability"); 
System.out.println("2's\t\t" + count2/rolls + "%"); 
System.out.println("3's\t\t" + count3/rolls + "%"); 
System.out.println("4's\t\t" + count4/rolls + "%"); 
System.out.println("5's\t\t" + count5/rolls + "%"); 
//and so on... 
} 
} 
0

我认为你需要使用二维数组如下:

int rolls = 0; 
System.out.print("Number of Rolls: "); 
rolls = in.nextInt(); 

int[][] numAndOccuranceCount= new int[11][2]; //sum will be between 2 -12 

//initialize your array 
for(int indx=0; indx<11;indx++){ 
    numAndOccuranceCount[indx] = new int[]{indx+2,0); 
} 

for(int timesRolled = 0; timesRolled < rolls; timesRolled++){ 
    die1 = randNum.nextInt(12); 
    die2 = randNum.nextInt(12); 
    actualDiceSum = die1 + die2; 

    for(int indx=0; indx<11;indx++){ 
     if(actualDiceSum == numAndOccuranceCount[i][0]){ 
      numAndOccuranceCount[indx][1] = numAndOccuranceCount[indx][1]+1; 
      break; 
     } 
    } 
} 

double proabability = 0.0; 
//compute and print the probablity as below: 
    for(int indx=0; indx<11;indx++){ 
    proabability = numAndOccuranceCount[indx][1]/rolls; 
    System.out.println("Probability of "+ numAndOccuranceCount[indx][0] +" = "+proabability); 
    } 
+0

不幸的是,我不允许在代码中使用数组。谢谢,不过。 – user1713336

+0

非常感谢您花时间帮助我! – user1713336

+0

您是否需要仅使用变量,if-else和for循环,还是可以使用其他集合对象(如List或Map)?用'if-else',它变成只有一个循环。即使你想用一维数组代替二维数组,我们也可以很容易地写出它。 –

0

我对你的代码的一些评论。

根据说明,你总结了dice1和dice2不是正确的方法,因为1 + 5 = 2 + 4 = 3 + 3,但它们是不同的。所以我们必须根据组合来计算可能性,而不是总和。

这里是我的代码:

DTO类:

public class DiceCombination { 
    private int dice1; 
    private int dice2; 

    public DiceCombination(int dice1, int dice2) { 
     this.dice1 = dice1; 
     this.dice2 = dice2; 
    } 
    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     return "Combination of [dice " + dice1 + " and dice " + dice2 + "]"; 
    } 
    /* (non-Javadoc) 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() { 
    final int prime = 31; 
    if(dice1 < dice2) { 
     return prime*dice1 + dice2; 
    } 
    else { 
     return prime*dice2 + dice1; 
    } 
} 
    /* (non-Javadoc) 
    * @see java.lang.Object#equals(java.lang.Object) 
    */ 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     DiceCombination other = (DiceCombination) obj; 
     if ((dice1 == other.dice1 && dice2 == other.dice2) || (dice1 == other.dice2 && dice2 == other.dice1)) 
      return true; 
     return false; 
    } 

} 

主要类:

public class Posibility { 

public static void main(String[] args) { 
    Map<DiceCombination,Integer> possibility = new HashMap<DiceCombination,Integer>(); 
    int dice1; 
    int dice2; 
    int roll = 400; // value here should be inputted from user, you may change any value you want 
    Random randNum = new Random(); 

    for(int i = 0; i < roll; i ++) { 
     dice1 = randNum.nextInt(12); 
     dice2 = randNum.nextInt(12); 
     DiceCombination dc = new DiceCombination(dice1, dice2); 
     if(possibility.containsKey(dc)) { 
      possibility.put(dc , possibility.get(dc) + 1); 
     } 
     else { 
      possibility.put(dc, 1); 
     } 
    } 
    for(DiceCombination key : possibility.keySet()) { 
     System.out.println("Result: " + key.toString() + " is " + ((double)possibility.get(key)/roll)); 
    } 
} 
} 
0

我@Thinhbk同意,问题是在组合方面技术上的措辞没有资金,但在链接中的图片显示的总和,所以我相信总和的意图。您所编写的组合方法令人印象深刻,但对于看起来像Java的前奏课程而言,这种方法太高级了。我喜欢图片显示IDE是BlueJ。带我回来。无论如何,赋值描述并没有指定需要一个inner for循环。我看到@ user1713336的编辑,数组没有别的之前允许你(user1713336的)第一循环中,您可以添加:

int[] count = new int[23]; 
//0 is the default value for each 
//int[22] is the 23rd value in the array 

什么是你的整个内部的循环可能会被替换为:

count[actualDiceSum]++; 

然后同时在for循环中打印,打印count[i]/rolls*100并在2开始int i,这是可能的最低值。我怀疑你会接下来学习阵列,所以我想展示它将如何完成。

既然你不能使用数组,你的countx = 0;行就好了。不要实时计算概率。这是不必要的和,并增加了很多行代码,只是不停的次数记录每个值卷起来:

if(actualDiceSum == 2) 
    count2++; 
else if(actualDiceSum == 3) 
    count3++; 
//etc 

请注意,您不需要使用{}如果只有一个行代码绑如图所示的if或while语句。然后按照以前的方式打印,count2/rolls*100(乘以100,因为图片显示的是百分比,而不是比率)。