使用随机对象模拟2个骰子,直到滚动2或12

时间:2014-10-23 22:42:17

标签: java random

public class DiceLoop {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int die1;
        int die2;
        int roll = 0;
        int count = 0;




        while(roll != 2 || roll != 12) {
            die1 = (int)(Math.random()*6 + 1); 
            die2 = (int)(Math.random()*6 + 1); 
            roll = die1 + die2;
            count = count + 1;

            System.out.println("Die 1: " + die1);
            System.out.println("Die 2: " + die2);
            System.out.println("Total: " + roll);

            if(roll == 2 || roll == 12){
                System.out.println("Stop rolling the dice. 2 or 12 has been thrown.");

                }
                else {

            }
        }
    }

}

我无法弄清楚为什么我的程序作为无限循环运行。我认为这可能是我的其他声明的问题,但我不能让骰子停止滚动。

5 个答案:

答案 0 :(得分:3)

快速查看后,我认为将||(逻辑或)更改为&&(逻辑AND)将解决问题。

public class DiceLoop
{
    public static void main(String[] args)
    {
        int die1;
        int die2;
        int roll = 0;
        int count = 0;

        while(roll != 2 && roll != 12)
        {
            die1 = (int)(Math.random()*6 + 1); 
            die2 = (int)(Math.random()*6 + 1); 
            roll = die1 + die2;
            count = count + 1;

            System.out.println("Die 1: " + die1);
            System.out.println("Die 2: " + die2);
            System.out.println("Total: " + roll);

            if(roll == 2 || roll == 12)
            {
                System.out.println("Stop rolling the dice. 2 or 12 has been thrown.");
            }
            else
            {

            }
        }
    }
}

有关说明,请参阅@drewmoore's answer

答案 1 :(得分:2)

@Nikola,@ ifLoop @StephenC都是正确的,但我认为用最简单的方式来说明为什么他们正确的是用真值表:

roll = 2      roll = 12     (roll != 2 || roll != 12) (roll != 2 && roll != 12)
   F              F                     T                        T
   F              T                     T                        F
   T              F                     T                        F
   T              T                     F                        F

使用逻辑OR(||)编写,当roll 12和2时,此语句仅为false - 当然这是不可能的,所以它总是如此,你有一个无限循环。使用逻辑AND时,如果roll不是12 AND 而不是2,则该语句为真,否则(如果它是 OR 12 或者两者(谁知道,也许在其他宇宙中可能存在)),它的错误,这就是你想要的。

答案 2 :(得分:1)

问题在于:

   while(roll != 2 || roll != 12) 

想一想。

  • 如果roll为2,则不会为12,因此false OR truetrue
  • 如果roll为12,则不会为2,因此true OR falsetrue
  • 如果滚动是其他内容,则true OR truetrue

简而言之,roll没有价值会导致roll != 2 || roll != 12评估为false。因此,你得到一个无限循环。

答案 3 :(得分:0)

你的条件:

while(roll != 2 || roll != 12)

单词:虽然滚动的数字不是2或12.但是永远不能评估为假! 使用&&(逻辑和)代替||(逻辑或)

答案 4 :(得分:0)

do while循环的定义

  

while语句在a时连续执行一个语句块   特殊情况属实。其语法可表示为:

     

while(表达式){

 statement(s)
     

}

让我们来看看你的while循环

 while(roll != 2 || roll != 12)

想象一下,roll的值是2或12.让我们假设是2

 while(2 != 2 || 2 != 12)
         ^         ^
        false      true

因此

 while(true) 

为什么?

由于逻辑OR,因此您看到此循环永远不会结束,因为基于while定义, while语句在特定条件为真时连续执行语句块

如果将逻辑OR更改为逻辑AND

 while(2 != 2 && 2 != 12)
         ^         ^
        false      true

因此

 while (false) 

并且它是基于while定义的循环结束。