[英]Odd random.randint behavior
我編寫了一個程序來創建一條蛇在屏幕上滑動的外觀。 您可以傳入蛇行進路徑的寬度和長度。 蛇在給定的寬度范圍內隨機移動。
一切都很好,除了測試我的護欄以將蛇保持在定義的寬度內。 我有時注意到蛇 position ( left_side
) 似乎能夠將 go 變為負值。 鑒於我有一個護欄,當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
在該迭代中不會減少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.