Python – 随机实际上不是随机的
Python – random is not actually random
我使用这个代码:
class Car:
def __init__(self):
self.start == [0, roads[0].index('#')]
while roads[self.start[0]][self.start[1]] == '#':
self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
self.start = tuple(self.start)
self.finish == [0, roads[0].index('#')]
while roads[self.finish[0]][self.finish[1]] == '#':
self.finish[0] = randint(0, len(roads)-1)
self.finish[1] = randint(0, len(roads[0])-1)
self.finish = tuple(self.finish)
self.kind = randint(0, 1)
它的作用是这样的:在这样表示的地图中:
#############1#########
#############1111######
#############1##1######
#######1111111111######
#############1#########
#############1#########
它找到两个 1 并将它们设置为开始和结束,然后它随机选择一个变量。然后我这样做:
a = Car()
b = Car()
才发现它们的起点和终点总是相同的,但有时种类不同。我不明白 - 如果随机不工作有问题,它也不应该在 self.kind 上工作!
我该如何解决?
也许你应该把你的作业改成这样:
self.start = [0, roads[0].index('#')]
还有这个:
self.finish = [0, roads[0].index('#')]
现在,您正在使用比较运算符。
您在此处使用相等性测试:
self.start == [0, roads[0].index('#')]
除非您在 class 级别拥有 start
属性,否则这将失败;它是 而不是 分配,它正在测试那里的平等性。你会在这里得到 NameError
!
所以,您可能 有一个 Car.start
class 属性,它是一个可变类型,如列表:
class Car:
start = [0, 0]
但忘了在你的问题中包含它。
然后分配给 self.start
个索引,class 属性:
self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
这是共享数据,因为它修改了class属性!
最后,您设置一个实例属性:
self.start = tuple(self.start)
包含共享数据。这同样适用于您的 self.finish
属性。
您可以使用赋值而不是等式测试来解决这个问题:
self.start = [0, roads[0].index('#')]
同样适用于self.finish
:
self.finish == [0, roads[0].index('#')]
您也可以在此处使用本地名称,并在完成构建列表后仅分配给实例属性。
我使用这个代码:
class Car:
def __init__(self):
self.start == [0, roads[0].index('#')]
while roads[self.start[0]][self.start[1]] == '#':
self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
self.start = tuple(self.start)
self.finish == [0, roads[0].index('#')]
while roads[self.finish[0]][self.finish[1]] == '#':
self.finish[0] = randint(0, len(roads)-1)
self.finish[1] = randint(0, len(roads[0])-1)
self.finish = tuple(self.finish)
self.kind = randint(0, 1)
它的作用是这样的:在这样表示的地图中:
#############1#########
#############1111######
#############1##1######
#######1111111111######
#############1#########
#############1#########
它找到两个 1 并将它们设置为开始和结束,然后它随机选择一个变量。然后我这样做:
a = Car()
b = Car()
才发现它们的起点和终点总是相同的,但有时种类不同。我不明白 - 如果随机不工作有问题,它也不应该在 self.kind 上工作!
我该如何解决?
也许你应该把你的作业改成这样:
self.start = [0, roads[0].index('#')]
还有这个:
self.finish = [0, roads[0].index('#')]
现在,您正在使用比较运算符。
您在此处使用相等性测试:
self.start == [0, roads[0].index('#')]
除非您在 class 级别拥有 start
属性,否则这将失败;它是 而不是 分配,它正在测试那里的平等性。你会在这里得到 NameError
!
所以,您可能 有一个 Car.start
class 属性,它是一个可变类型,如列表:
class Car:
start = [0, 0]
但忘了在你的问题中包含它。
然后分配给 self.start
个索引,class 属性:
self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)
这是共享数据,因为它修改了class属性!
最后,您设置一个实例属性:
self.start = tuple(self.start)
包含共享数据。这同样适用于您的 self.finish
属性。
您可以使用赋值而不是等式测试来解决这个问题:
self.start = [0, roads[0].index('#')]
同样适用于self.finish
:
self.finish == [0, roads[0].index('#')]
您也可以在此处使用本地名称,并在完成构建列表后仅分配给实例属性。