Buffon's needle simulation in python

后端 未结 6 1483
臣服心动
臣服心动 2021-01-27 18:47
import numpy as np
import matplotlib.pylab as plt

class Buffon_needle_problem:

    def __init__(self,x,y,n,m):
        self.x = x #width of the needle
        self.y =         


        
6条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-27 18:58

    Looks like you were committing a simple rounding error. The code below works, though the results are not very close to pi...

    import numpy as np
    import matplotlib.pylab as plt
    
    class Buffon_needle_problem:
    def __init__(self,x,y,n,m):
        self.x = x #width of the needle
        self.y = y #witdh of the space
        self.r = []#coordinated of the centre of the needle
        self.z = []#measure of the alingment of the needle
        self.n = n#no of throws
        self.m = m#no of simulations
        self.pi_approx = []
    
    def samples(self):
        # throwing the needles
        for i in range(self.n):
            self.r.append(np.random.uniform(0,self.y))
            self.z.append(np.random.uniform(0,self.x/2.0))
        return [self.r,self.z]
    
    def simulation(self):
        #self.samples()
        # m simulations
        for j in range(self.m):
            self.r=[]
            self.z=[]
            for i in range(self.n):
                self.r.append(np.random.uniform(0,self.y))
                self.z.append(np.random.uniform(0,self.x/2.0))
            # n throws
            hits = 0 # setting the succes to 0
            for i in range(self.n):
                # condition for a hit
                if self.r[i]+self.z[i]>=self.y or self.r[i]-self.z[i] <= 0.0:
                    hits += 1
                else:
                    continue
            hits = 2.0*(float(self.x)/self.y)*float(self.n)/float(hits)
            self.pi_approx.append(hits)
    
        return self.pi_approx
    
    y = Buffon_needle_problem(1,2,40000,5)
    print (y.simulation())
    

    Also note that you were using the same sample for all simulations!

提交回复
热议问题