Algorithm 1.1 Buffon throws = 10000 x = np.random.rand(throws) # 10000 vector of samples from U(0,1) theta = 0.5*np.pi*np.random.rand(throws) # 0 < theta's < pi/2 hits = (x<0.5*np.sin(theta)) # vector of true/false print 'pi estimate:',throws/float(sum(hits))
Algorithm 1.2 Buffon Ab Initio # Ab initio buffon needle program to estimate pi by Buffon simulation # without knowing pi to start with. # To convert to the simulation with pi known, use PI instead of pi. import numpy as np trials = 10000 segments = 20 #avoid division by 0 PI = np.pi d = 2; L = 1; #for reference pi = 1.0 # starting value for iteration throws = 0; hits = 0 for i in range(trials): x = np.random.rand(segments) # 0 < x < d/2 theta = 0.5*pi*np.random.rand(segments) # 0 < theta < pi/2 hits += (x<0.5*np.sin(theta)) # unlikely to be 0 after 20 throws throws += segments pi = throws/float(sum(hits)) print('estimate of pi after', throws, 'throws:', pi)
Algorithm 1.3 Buffon's Histogramming Algorithm import numpy as np import matplotlib.pyplot as plt throws = 100 # 100 trials replications=4000 y= [0.]*replications for i in range(replications): x=np.random.rand(throws) theta=0.5*np.pi*np.random.rand(throws) hits= (x<=0.5*np.sin(theta)) y[i] = (sum(hits)/float(throws)) # y= result vector recipEst=sum(y)/float(replications) vVec=(y-recipEst)*(y-recipEst); # vector of sqr deviations print vVec v=sum(vVec)/(replications-1); # sample variance stddev=np.sqrt(v) # sample standard deviation piEst=1/recipEst print piEst #fig = plt.figure(figsize=(6,6)) fig = plt.figure() # defaults to 640x480, 100 px/in plt.hist(y,bins=12) #fig.savefig('histoPlot.png', bbox_inches='tight', dpi=150) fig.savefig('recipHist.png') plt.show()
Algorithm 1.4 Gambler's Fortune import numpy as np import random import matplotlib.pyplot as plt R = [] i=0; R.append(100); # gambler's initial fortune} while( R[i] > 0 and R[i]<2100 ): i=i+1 W = (random.random() < 0.5); # random value of 0 or 1} W = 2*W - 1; # random value of +/-1} R.append(R[i-1]+W) # gamblers new fortune} x = np.linspace(1,len(R),len(R)) plt.plot(x,R) # plot R against its index plt.show() # run for investigating running time T = [] for j in range(20): R = [] i=0; R.append(100); while( R[i] > 0 and R[i] < 2100 ): i=i+1 W = 2*(random.random() < 0.5)-1 R.append(R[i-1]+W) T.append(i) fig = plt.figure(figsize=(6,6)) #fig = plt.figure() # defaults to 640x480, 100 px/in plt.hist(T,bins=12) #fig.savefig('histoPlot.png', bbox_inches='tight', dpi=150) #fig.savefig('histoPlot.png') plt.show()
Algorithm 1.5 Dice Rolling import numpy as np import random import matplotlib.pyplot as plt nRolls = 60 red = np.array([random.randint(1,6) for i in range(nRolls)]) green = np.array([random.randint(1,6) for i in range(nRolls)]) dice = red+green b=round(1+13/0.1) x = np.linspace(0,13,b) cdf = [] for i in range(len(x)): cdf.append(sum(dice <= x[i])) fig = plt.figure() plt.title("Dice pair cdf for "+str(nRolls)+" rolls") plt.plot(x,cdf) fig.savefig('dicerollCDF.png') plt.show()
Algorithm 1.6 Joint Probabity Histogram import seaborn as sns import pandas as pd import matplotlib.pyplot as plt import numpy as np mat = np.random.randint(low = 10, high = 30, size = (60,2)) #print(mat) df4 = pd.DataFrame(mat,columns=["x","y"]) sns.set(font_scale=1.44) # increase from standard 1 sns.jointplot(data=df4,x="x",y="y",kind='hist',bins=20, marginal_kws=dict(bins=20)) ## each blue square = 1/60, black = 2/60 #sns.jointplot(data=df4,x="x",y="y",kind='hist',marginal_kws=dict(fill=False)) # marginal_kws=dict(bins=25, fill=False)) plt.suptitle("Joint Histogram and Marginals", y=1.01) # y raises the title #plt.savefig("jointHistogram.png") plt.show()
Algorithm 1.7 Middle Sine import numpy as np import math import time import random tenpow5 = 100000 nIts = 1000000 x= 0.5 for i in range(10): x = tenpow5*np.sin(x) w = math.floor(x) x = x-w print(x) # timing start = time.time() for i in range(nIts): x = tenpow5*np.sin(x) w = math.floor(x) x = x-w end = time.time() print('time for '+str(nIts)+' middle digits',end-start) # 2.03615999222 start = time.time() for i in range(nIts): #x = np.random.rand(1); # 0.814379930496 x = np.random.random_sample(); # 0.28878903389 end = time.time() print('time for '+str(nIts)+' built-in in a loop ',end-start) start = time.time() y = np.random.rand(nIts) # 0.0099949836731 end = time.time() print('time for '+str(nIts)+' vector generation',end-start)
Algorithm 1.8 Middle Square import math tenpow7 = 10000000 x = 0.1234567; # initial seed for i in range(2): x = x*tenpow7; # x now an integer w = x*x; # square w = math.floor(w/1000); # drop last three digits w = w/tenpow7; # 7 decimal digits x = w - math.floor(w) # drop the integer digits print('next seed ',str(x))
Algorithm 1.9 Hit-or-Miss for pi import numpy as np nTrials = 10000 x = np.random.rand(nTrials) y = np.random.rand(nTrials) hits=sum(x**2+y**2<1) # x squared plus y squared piEst = 4*hits/float(nTrials) print piEst
Algorithm 1.10 Coupon Collecting import numpy as np import random import matplotlib.pyplot as plt nLetters = 9 # ANGELFISH} nTrials = 10000 nTries = [0]*nTrials for i in range(nTrials): success = 0 nTries[i] = 0 # redundant but reassuring angelfish = [0]*nLetters # reset no letters achieved while success == 0: nTries[i] += 1 #inc. count buy = random.randint(0,nLetters-1) #letter obtained angelfish[buy] = 1 if sum(angelfish)==nLetters: success = 1 #print nTries fig = plt.figure() plt.hist(nTries) plt.show()
Algorithm 1.11 Permutations import random n = 9 # a permutation of 9 objects m = 5 # do 5 of them perm = [i for i in range(n)] #identity permutation for i in range(m): j = random.randint(i,n-1) # from the remaining swap = perm[i] perm[i] = perm[j] perm[j] = swap result = [perm[i] for i in range(m)] print result