奇怪的random.randint行为

我编写了一个程序来创建一条从屏幕上滑下的蛇的外观。您可以传入蛇行进路径的宽度和长度。蛇在给定的宽度范围内随机移动。

一切都很好,除了在测试我的护栏以将蛇保持在定义的宽度内时。我注意到有时蛇的位置 ( left_side) 似乎能够变为负值。鉴于我有一个护栏,当left_side== 0 时,它应该只能向右移动,因为当该条件为真时,我可以添加的唯一值应该是 0 或 1。

我该如何解决?

我的代码:

import random
import time

def path(path_width, snake_pos):
    path = ""
    for space in range(path_width + 1):
        if space == 0:
            path = path + "|"
        if space == snake_pos:
            path = path + "()"
        if space == width: 
            path = path + "|"
        else:
            path = path + " "
    return path

width = int(input("How wide is your course? "))
length = int(input("How long is your course? "))

left_side = random.randint(1, width -1)

i=1
while i < length:
    if left_side == 0:
        left_side = left_side + random.randint(0, 1)
    if left_side == width:
        left_side = left_side + random.randint(-1, 0)
    else:
        left_side = left_side + random.randint(-1, 1)
    print(path(width, left_side) + " : leftside = " + str(left_side))
    i += 1
    time.sleep(.05)

回答

您的护栏的问题在于:

if left_side == 0:
    left_side = left_side + random.randint(0, 1)
if left_side == width:
    left_side = left_side + random.randint(-1, 0)
else:
    left_side = left_side + random.randint(-1, 1)

问题是,您使用的是if/ if/else工作流程; 如果满足第一个if条件,它将执行其中的代码,然后检查第二个if语句并执行该代码或附加else块中的代码。

这是您代码的当前工作流程:它检查是否left_side为 0,如果是,则将 0 或 1 添加到left_side. 然后检查是否left_side等于width。如果是,则将 -1 或 0 添加到left_side. 如果不是,则将else执行该语句并将 -1、0 或 1 添加到left_side.

这意味着循环的每次迭代left_side都有机会减一,因为第二个if块或else它下面的块将在每次迭代中执行,并且random.randint两者中的语句都有机会评估为 -1。

解决方法很简单,就是将第二条if语句改为一条elif语句,如下所示:

if left_side == 0:
    left_side = left_side + random.randint(0, 1)
elif left_side == width:
    left_side = left_side + random.randint(-1, 0)
else:
    left_side = left_side + random.randint(-1, 1)

现在,如果满足第一个条件 ( left_side == 0),它不会检查是否left_side == width在循环的同一迭代中,这意味着left_side在该迭代中不会减少。


以上是奇怪的random.randint行为的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>