簡體   English   中英

奇怪的 random.randint 行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM