奇怪的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在该迭代中不会减少。