You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用random类触发randrange空范围ValueError错误求助

问题根因
  • 初始房间被重置清空:generateLevel函数执行时先调用resetLevel把rooms数组全部设为0,你在全局预先设置的中心位置初始房间(值为1)直接被清空,findPossibleRooms遍历的时候找不到任何已存在的房间,候选列表始终为空。
  • 全局变量未正确声明:possibleNextRoom是全局变量,在resetLevel、findPossibleRooms函数中修改时没有加global关键字,函数内操作的是局部同名变量,全局的候选列表永远是空,调用random.randrange(0, 0)直接触发报错。
  • 候选列表重复追加:findPossibleRooms每次调用前没有清空旧数据,会反复追加重复坐标,导致后续生成逻辑异常。
  • 数组索引越界风险:遍历房间时没有做边界校验,比如r=0时访问r-1会得到负索引,触发数组访问异常。
修复后完整代码
import random
import numpy as np

class Room:
  def __init__(self, name, contents):
    self.name = name
    self.contents = contents

rooms = np.zeros((11, 11))
maxRooms = 7
possibleNextRoom = []

def resetLevel():
  global rooms, possibleNextRoom
  # 清空所有房间
  for r in range(len(rooms)):
    for c in range(len(rooms[0])):
      rooms[r][c] = 0
  # 初始化中心起始房间
  halfHeight = int(len(rooms[1]) / 2)
  halfWidth = int(len(rooms[0]) / 2)
  rooms[halfWidth][halfHeight] = 1
  # 清空候选房间列表
  possibleNextRoom = []

def countRooms():
  global rooms
  roomCount = 0
  for r in range(len(rooms)):
    for c in range(len(rooms[0])):
      if rooms[r][c] == 1:
        roomCount += 1
  return roomCount

def findPossibleRooms():
  global possibleNextRoom, rooms
  # 每次重新查找前清空旧候选
  possibleNextRoom.clear()
  max_row = len(rooms) - 1
  max_col = len(rooms[0]) - 1
  for r in range(len(rooms)):
    for c in range(len(rooms[0])):
      if rooms[r][c] == 1:
        # 四个方向增加边界校验,避免越界
        if c + 1 <= max_col and rooms[r][c+1] != 1:
          possibleNextRoom.append((r, c+1))
        if c - 1 >= 0 and rooms[r][c-1] != 1:
          possibleNextRoom.append((r, c-1))
        if r - 1 >= 0 and rooms[r-1][c] != 1:
          possibleNextRoom.append((r-1, c))
        if r + 1 <= max_row and rooms[r+1][c] != 1:
          possibleNextRoom.append((r+1, c))

def addRoom():
  global possibleNextRoom, rooms
  # 无可用候选时直接返回避免报错
  if not possibleNextRoom:
    return
  nextRoom = random.randrange(0, len(possibleNextRoom))
  rooms[possibleNextRoom[nextRoom][0]][possibleNextRoom[nextRoom][1]] = 1
  possibleNextRoom.pop(nextRoom)

def generateLevel():
  resetLevel()
  while countRooms() < maxRooms:
    findPossibleRooms()
    addRoom()

def displayLevel():
  print(rooms)

generateLevel()
displayLevel()

内容的提问来源于stack exchange,提问作者Jedidiah Blitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:36:03