1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| import mathimport randomimport pylab
class Location(object): def __init__(self, x, y): self.x = float(x) self.y = float(y) def move(self, xc, yc): return Location(self.x + float(xc), self.y+float(yc)) def getCoords(self): return self.x, self.y def getDist(self, other): ox, oy = other.getCoords() xDist = self.x - ox yDist = self.y - oy return math.sqrt(xDist**2 + yDist ** 2)
class CompassPt(object): possibles = ('N', 'S', 'E', 'W') def __init__(self, pt): if pt in self.possibles: self.pt = pt else: raise ValueError('in CompassPt.__init__') def move(self, dist): if self.pt == 'N': return (0, dist) elif self.pt == 'S': return (0, -dist) elif self.pt == 'E': return (dist, 0) elif self.pt == 'W': return (-dist, 0) else: raise ValueError('in compassPt.move')
class Field(object): def __init__(self, drunk, loc): self.drunk = drunk self.loc = loc def move(self, cp, dist): oldLoc = self.loc xc, yc = cp.move(dist) self.loc = oldLoc.move(xc, yc) def getLoc(self): return self.loc def getDrunk(self): return self.drunk
class Drunk(object): def __init__(self, name): self.name = name def move(self, field, time=1): if field.getDrunk() != self: raise ValueError('Drunk.move called with drunk not in field') for i in range(time): pt = CompassPt(random.choice(CompassPt.possibles)) field.move(pt, 1) def performTrial(time, f): start = f.getLoc() distances = [0.0] for t in range(1, time+1): f.getDrunk().move(f) newLoc = f.getLoc() distance = newLoc.getDist(start) distances.append(distance) return distances
drunk = Drunk('a man') for i in range(3): f = Field(drunk, Location(0, 0)) distances = performTrial(500, f) pylab.plot(distances) pylab.title('random walk') pylab.xlabel('time') pylab.ylabel('distance from origin')
pylab.show()
assert False
|