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('#')]

您也可以在此处使用本地名称,并在完成构建列表后仅分配给实例属性。