【问题标题】:ValueError with random class in python not workingpython中随机类的ValueError不起作用
【发布时间】:2021-12-18 08:40:34
【问题描述】:

代码如下:

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

  for r in range(len(rooms[0])):
    for c in range(len(rooms[1])):
      rooms[r][c] = 0

  possibleNextRoom = []

halfHeight = int(len(rooms[1]) / 2)
halfWidth = int(len(rooms[0]) / 2)
rooms[halfWidth][halfHeight] = 1

def countRooms():
  global rooms

  roomCount = 0

  for r in range(len(rooms)):
    for c in range(len(rooms)):
      if rooms[r][c] == 1:
        roomCount += 1

  return roomCount

def findPossibleRooms():

  for r in range(len(rooms) - 1):
    for c in range(len(rooms) - 1):
      if rooms[r][c] == 1:
        if rooms[r][c+1] != 1:
          possibleNextRoom.append((r, c+1))
        if rooms[r][c-1] != 1:
          possibleNextRoom.append((r, c-1))
        if rooms[r-1][c] != 1:
          possibleNextRoom.append((r-1, c))
        if rooms[r+1][c] != 1:
          possibleNextRoom.append((r+1, c))

def addRoom():

  nextRoom = random.randrange(0, len(possibleNextRoom))
  rooms[possibleNextRoom[nextRoom][0]][possibleNextRoom[nextRoom][1]] = 1
  possibleNextRoom.pop(nextRoom)

def generateLevel():
  resetLevel()

  while countRooms() < maxRooms:
    countRooms()
    findPossibleRooms()
    addRoom()

def displayLevel():
  print(rooms)

generateLevel()
displayLevel()

这是错误:

ValueError: empty range for randrange() (0, 0, 0)

我以为我正确地使用了随机数,但显然不是。我试着让数组从里面的东西开始,但它仍然给了我同样的错误。我已经为此工作了很长时间,这让我很头疼。对此的任何帮助将不胜感激。错误在第 54 行。

【问题讨论】:

  • 错误出现在第 54 行 @Leo
  • 在调用该函数之前尝试打印possibleNextRoom。你会看到它是空的。
  • 这行得通,但现在它给了我 TypeError: 'int' object is not subscriptable on line 56
  • 原因 #31857 为什么你不想摆弄全局变量。您确实需要通过传递参数和返回结果来学习如何正确使用函数,因为这种类型的编程会导致这种类型的问题:真的很难找到错误。
  • 我知道是什么意思,但是 rooms 和 possibleNextRoom 都是数组@Leo

标签: python arrays python-3.x numpy random


【解决方案1】:
In [90]: import random
In [91]: random.randrange?
Signature: random.randrange(start, stop=None, step=1, _int=<class 'int'>)
Docstring:
Choose a random item from range(start, stop[, step]).
...

这会产生你的错误:

In [92]: random.randrange(0,0)
Traceback (most recent call last):
  File "<ipython-input-92-566d68980a89>", line 1, in <module>
    random.randrange(0,0)
  File "/usr/lib/python3.8/random.py", line 226, in randrange
    raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width))
ValueError: empty range for randrange() (0, 0, 0)

所以如果错误发生在(告诉我们行号,如果 52 几乎没用)

nextRoom = random.randrange(0, len(possibleNextRoom))

这意味着 possibleNextRoom 是一个空列表,[](或者可能是其他带有 0 的 len)。

我看到了

possibleNextRoom = []

findPossibleRooms 中的append 就地操作,所以可以修改这个全局列表。但是它们被包裹在forif中,所以我不能说它们是否运行。

在任何情况下,错误都表明没有附加任何内容,出于某种原因。

【讨论】:

  • 非常感谢
猜你喜欢
  • 2016-05-15
  • 2015-05-27
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2014-05-12
  • 2011-01-19
相关资源
最近更新 更多