Python - 随机实际上并不是随机的

时间:2015-04-08 21:26:15

标签: python 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上工作!
我该如何解决?

2 个答案:

答案 0 :(得分:4)

您在这里使用了相等测试:

self.start == [0, roads[0].index('#')]

除非你在班级有start属性,否则会失败;它是分配,它正在测试那里的平等。你在这里得到NameError

所以,你可能有一个Car.start类属性,它是一个可变类型,如列表:

class Car:
    start = [0, 0]

但忘记在你的问题中加入。

然后分配给self.start索引,类属性:

self.start[0] = randint(0, len(roads)-1)
self.start[1] = randint(0, len(roads[0])-1)

这是共享数据,因为这会修改类属性!

最后,设置一个实例属性:

self.start = tuple(self.start)

包含共享数据。这同样适用于您的self.finish属性。

您可以使用 assign 而不是相等测试来解决此问题:

self.start = [0, roads[0].index('#')]

同样适用于self.finish

self.finish == [0, roads[0].index('#')]

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

答案 1 :(得分:2)

您可能应该将作业更改为:

self.start = [0, roads[0].index('#')]

和此:

self.finish = [0, roads[0].index('#')]

目前,您正在使用比较运算符。