import numpy as np
from numpy import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
from matplotlib import animation

lfsr = 1000


def lfsr11():
	# 11 bit lfsr
	global lfsr
	order = 11
	taps = [0,10] #subtract 1

	bit = (((lfsr >> (taps[0])) ^ (lfsr >> (taps[1]))) & 1)
	lfsr = (lfsr>>1) | (bit << order-1)

	# print(bin(x))
	# print(x)
	number = int(lfsr)
	return lfsr

def lfsr_bit():
	# -1 or 1
	# print(lfsr)
	num = lfsr11()
	if num > pow(2,11-1):
		return 1
	else:
		return -1


def init():
	global steps, movers, x, y, xx, yy
	y = array(arange(movers))
	xx = ndarray(shape=(movers,steps))
	yy = ndarray(shape=(movers,steps))

	for i in range(0,steps):
		for j in range(0,movers):
			y[j] = 0


steps = 1000
movers = 10
init()
for i in range(0,steps):
	for j in range(0,movers):
		dy = lfsr_bit()
		y[j] += dy
		yy[j][i] = y[j]
		xx[j][i] = i

plt.figure()
for j in range(movers):
	plt.plot(xx[j],yy[j])

var = []
means = []
for i in range(steps):
	variance = 0
	for j in range(movers):
		variance += pow(yy[j][i] - mean(yy[:,i]),2)
	var.append(variance/movers)
	means.append(mean(yy[:,i]))
	# print(var)

stdevs = [sqrt(x) * 1.5 for x in var]
plt.errorbar(range(steps),means,stdevs)
plt.title('Brownian Motion')

plt.show()



