生成随机0/1输出时的无限循环

时间:2018-03-05 22:38:12

标签: loops infinite-loop

入门级comp sci major here ..我确定这个问题可能有一个明显的答案,但我简直无法弄清楚为什么以下代码产生无限循环而且它让我疯了。我理解Math.random()返回double值,当乘以10时,将小数一次向右移动,(int)double数据类型转换为整数,方法是截断小数点后面的其余数字..但是为什么地球上的以下代码产生无限循环boolean表达式中的一个最终会产生true值?

现在,如果我在循环中使用&&而不是||,它将正常工作,因为&&在确定之前检查两个表达式true的收益率整个表达的结果。啊..帮助..

int x; 

do {

    x = (int)(Math.random() * 10);

} 

while (x != 1 || x != 0);

3 个答案:

答案 0 :(得分:3)

实际上很简单:你的变量'x'不能是两个不同的整数值。如果您的变量是0,1,2,3,4,5,6,7,8或9,则无关紧要。您的while条件将始终为true,因此您的循环将永远运行。

e.g:

x = 0: (x != 1 => true || x != 0 => false) => true
x = 1: (x != 1 => false || x != 0 => true) => true
x = 2: (x != 1 => true || x != 0 => true) => true
...

答案 1 :(得分:0)

while循环在条件为真时继续

对于x的任何值,你写的条件总是如此。

数字总是"不同于0"或"与1"不同(或两者兼有)。

因此,无限循环。

也许你认为`||,逻辑'或',意思是"第一个或第二个是真的,但不是两个" ?

如果您想要" x!= 0或x!= 1,而不是两个",那么您实际上是指x == 0 || x == 1

答案 2 :(得分:0)

我想我现在理解我的错误思考..用||表达式,如果第一个表达式的计算结果为false,则第二个表达式也始终被计算。如果在||中有一个表达式,我的印象类似于&&&是假的,整个被解释为也是假的,但结果是(假|| true)=真而(假&&真)=假以及(真&&假)=假,但不同于||,在&&和编译器中,当第一个表达式产生错误但是||时,编译器甚至不打算评估第二个表达式。仅在第一个为假时才评估两者。我想我明白了......