石头剪刀布 – 从强行判断到巧妙处理
本文最后更新于 590 天前,其中的信息可能已经有所发展或是发生改变。

前言

这一开始仅为一个简单题目,使用 random.choice 实现石头剪刀布的出招,无需判断,就像下面这样:

from random import choice
gList = ['石头','剪刀','布']
for _ in range(10):
    print(choice(gList),choice(gList))

强行判断

留着如此一题,不加以完善十足可以,那为何不对出拳结果加以判断呢?

这看起来很容易,做起来也很容易,只需要像下面这样:

from random import choice
gList = ['石头','剪刀','布']
c = 100
w_a = 0
w_b = 0
def win(a,b):
    if a == b:
        return 0
    elif a == '石头':
        if b == '剪刀':
            return 1
        elif b == '布':
            return 2
        else:
            return
    elif a == '剪刀':
        if b == '石头':
            return 2
        elif b == '布':
            return 1
        else:
            return
    elif a == '布':
        if b == '石头':
            return 1
        elif b == '剪刀':
            return 2
        else:
            return
    else:
        return
for _ in range(c):
    a = choice(gList)
    b = choice(gList)
    print(f'A:{a} B:{b}',end=' ')
    w = win(a,b)
    if w == 1:
        print('A胜')
        w_a += 1
    elif w == 2:
        print('B胜')
        w_b += 1
    else:
        print('平局')
print(f'共{c}局')
print(f'A胜{w_a}局, 胜率{"%0.5f"%(w_a/c)}')
print(f'B胜{w_b}局, 胜率{"%0.5f"%(w_b/c)}')

如此一来,谁胜谁负,一目了然。

但这,是否显得太过冗长?

巧妙判断

先来做一些假定:

$ 石头 = 1 $

$ 剪刀 = 2 $

$ 布 = 3 $

作出上述假定之后,让我们对出招及胜负情况进行分析:

ABA-B胜负
石头石头0
石头剪刀-1A
石头-2B
剪刀石头1B
剪刀剪刀0
剪刀-1A
石头2A
剪刀1B
0
石头剪刀布胜负分析

由上分析可知:

  • 若A赢,则 A-B 为 -1 或 2
  • 若B赢,则 A-B 为 1 或 -2
  • 若平局,则 A-B 为 0

那么,上述判断过程即可简化:

from random import choice
gList = ['石头','剪刀','布']
wList ={'石头':1,'剪刀':2,'布':3}
for _ in range(10):
    a,b = choice(gList),choice(gList)
    w = wlist[a] - wList[b]
    print(f'A:{a} B:{b}',end=' ')
    if w == 0:
        print('平')
    elif w == -1 or w == 2:
        print('A胜')
    elif w == 1 or w == -2:
        print('B胜')

显然,这种判断方式与强制判断相比更高效、更简洁。

知识共享许可协议

本作品(《石头剪刀布 – 从强行判断到巧妙处理》由 gggxbbb)采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。


转载请注明出处: https://evax.top/2020/12/30/rsp-from-if-to-smart.html

暂无评论

发送评论 编辑评论


				
下一篇