布尔条件受输入影响

问题描述 投票:0回答:2

我正在测试当我将随机值传递给Python中的任意布尔条件时会发生什么。我运行了一个循环10次并且每次向A和B随机选择True或False。然后我看到条件返回True或False并输出A和B的值。

for i in range(10):
    A = random.choice([True, False])
    B = random.choice([True, False])

    if (A and (A or B)) == True:
        print("Pass:")
        print("A: {} B: {}".format(A, B))
    else:
        print("Fail:")
        print("A: {} B: {}".format(A, B))

输出:

Pass:              Fail:               Pass:                Pass:
A: True B: True    A: False B: True    A: True B: False     A: True B: False 
Pass:              Pass:               Pass:
A: True B: True    A: True B: False    A: True B: True 
Pass:              Pass:               Fail:
A: True B: True    A: True B: True     A: False B: False

我选择的布尔条件是随机写的(意味着没有特定的原因),但我在输出中找到了一种模式。

在所有Passes中B的值是不同的(Fails相同),但是在Passes中A的值始终为True而在Fails中为False。请记住,Pass是条件为True的结果,因此似乎条件恰好返回一个与输入A相同的布尔值。

由于我发现这个特殊情况很奇怪,我又进行了另一次测试。这次我检查了这个布尔表达式是否始终与A的初始输入相同。我还运行了20次以获得更多输入的随机值。

for i in range(20):
    A = random.choice([True, False])
    B = random.choice([True, False])
    if (A and (A or B)) == A:
        print("Pass")
    else:
        print("Fail")

输出:

Pass
Pass
Pass
. . .
Pass
Pass
Pass

我已经简化了输出,但是当我运行代码时,它提供了所有20次传递,并且在代码运行几次时也是如此。

我的问题是为什么这个条件,我猜“简化”,只是输入A?并且布尔表达式可以“简化”(因为在这种情况下,如果结果总是只是A,则整个表达式呈现无意义)以缩短条件吗?

boolean symbolic-math
2个回答
1
投票

这是符号逻辑的一个微不足道的结果。

如果A为true,那么表达式的计算结果如下:

True and (True or B)
True or B
True

1
投票

这个数学领域被称为布尔代数。您的具体示例是吸收定律,例如,形式10a或“X•(X + Y)= X”:

https://www.mi.mun.ca/users/cchaulk/misc/boolean.htm

(在布尔代数中,“和”有时写为•和“或”有时写为+。这使得整数代数的类比更加明显,例如X + 0 = X和X•0 = 0。)

你的“可以简化布尔表达式”这个更大的问题取决于表达式!它们通常可以,但某些形式是完全简化的。完整的讨论超出了Stack Overflow的范围 - 有各种Web资源或在线类。这并不是特别困难,但它是一个比一个答案所涵盖的更大的主题。

© www.soinside.com 2019 - 2024. All rights reserved.