乱数を使って円周率もどきを求める2

先日試した乱数を使った円周率を求める方法を
numpyを使った方法に置き換えた。

import math
import time
import numpy as np


def calc_pi ( NN ):
  arr1 = np.random.rand(NN)
  arr2 = np.random.rand(NN)
  arr3 = np.sqrt(arr1 * arr1 + arr2 * arr2)
  arr3[arr3 > 1] = 0   #1より大きい要素は0に
  arr3[arr3 > 0] = 1   #0より大きい要素は1に
  in_n = np.sum(arr3)  #円内に入ったやつの合計

  return ( in_n / NN ) * 4


if __name__ == "__main__":

  for j in range (1,9):
    NN = 10 ** j
    start_time = time.perf_counter()
    pi = calc_pi(NN)
    execution_time = time.perf_counter() - start_time
    delt = math.fabs(math.pi - pi)
    print (str(NN).rjust(10),"  ",f'{pi:11.010f}',"  ",f'{delt:7.06f}',"  ",execution_time)

実行結果

   試行回数        結果      誤差     処理時間[sec]
        10    2.8000000000    0.341593    8.769400028540986e-05
       100    3.1200000000    0.021593    4.6955000016168924e-05
      1000    3.1960000000    0.054407    5.6955000218295027e-05
     10000    3.1420000000    0.000407    0.0003660469997157634
    100000    3.1376400000    0.003953    0.0036325510000096983
   1000000    3.1415240000    0.000069    0.03182136600025842
  10000000    3.1416492000    0.000057    0.2625446400002147
 100000000    3.1416174400    0.000025    2.535640128000068

numpy使わずにwhileで計算していたまえの処理に較べて15倍位早い結果。全て配列に収めてから処理するとさすがに早い。ただしメモリもバカ喰い。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA