1

私は、確率の代わりにランダム性を使用するという単純な方法で、Buffoon's Needle 実験を作成しようとしていました。pi の値は、式 pi = 2*ln/th から求めることができます。ここで、l = 針の長さ、n = 針を落とす回数、t = 線の幅、h = 針が線を横切る回数です。l = t と仮定したため、方程式は pi = 2*n/h に減りました。今、私は2つのコードを作りました。コード 1:

import math, random
h = 0.0
n = 0.0
for i in range(0,10000):
    a = random.random()
    if a > 0.64:
        h = h+1
    else:
        n = n+1
re = 2*(n+h)/n
print "Value of pi is ", re
err = (math.pi - re)*100/(math.pi)
print "Percentage error is  ", abs(err)

現在、これは問題なく動作しており、十分な結果が得られています。しかし、次のコードは同じ答えを何度も繰り返しています。コード 2:

import random, time, math
h=1.0
n=1.0
err = 0.0
while err < 0.1:
    a = random.random()
    if a > 0.64:
        h = h+1
    else:
        n = n+1
    re = 2*(n+h)/n
    err = (math.pi - re)*100/(math.pi)
print "Number of attempts is ", n+h

誰かが理由を教えてもらえますか??

4

3 に答える 3

0

最初はエラーをできるだけ大きくしてから、十分に小さくなるまでループします。使用する

import sys

error = sys.float_info.max
epsilon = 0.1
while err > epsilon:
    ...

また、通常、差も負になる可能性があるため、エラーを取得するには、 abs を使用して大きさのみを比較します。したがって、より慣用的なプログラムが得られます

import random, time, math
import sys

h = n = 1.0
err = sys.float_info.max
epsilon = 0.001

while err > epsilon:
    a = random.random()
    if a > 0.64:
        h += 1
    else:
        n += 1

    re = 2 * (n + h) / n
    err = abs((math.pi - re) / math.pi)

print "Value of pi is ", re
print "Number of attempts is ", n + h
于 2013-08-17T05:42:07.807 に答える