1
+ import numpy as np
2
+ import math , statistics , time
3
+ import ray
4
+
5
+ num_workers = 4
6
+ trials = 20
7
+
8
+ ray .init (ignore_reinit_error = True )
9
+
10
+ def estimate_pi (num_samples ):
11
+ xs = np .random .uniform (low = - 1.0 , high = 1.0 , size = num_samples )
12
+ ys = np .random .uniform (low = - 1.0 , high = 1.0 , size = num_samples )
13
+ xys = np .stack ((xs , ys ), axis = - 1 )
14
+ inside = xs * xs + ys * ys <= 1.0
15
+ xys_inside = xys [inside ]
16
+ in_circle = xys_inside
17
+ approx_pi = 4.0 * in_circle / num_samples
18
+ return approx_pi
19
+
20
+ Ns = [10000 , 50000 , 100000 , 500000 , 1000000 ] #, 5000000, 10000000] # Larger values take a long time on small VMs and machines!
21
+ maxN = Ns [- 1 ]
22
+
23
+ fmt = '{:10.5f} seconds: pi ~ {:7.6f}, stddev = {:5.4f}, error = {:5.4f}%'
24
+ def try_it (n , trials ):
25
+ print ('trials = {:3d}, N = {:s}: ' .format (trials , str_large_n (n , padding = 12 )), end = '' ) # str_large_n imported above.
26
+ start = time .time ()
27
+ pis = [estimate_pi (n ) for _ in range (trials )]
28
+ approx_pi = statistics .mean (pis )
29
+ stdev = statistics .stdev (pis )
30
+ duration = time .time () - start
31
+ error = (100.0 * abs (approx_pi - np .pi )/ np .pi )
32
+ print (fmt .format (duration , approx_pi , stdev , error )) # str_large_n imported above.
33
+ return trials , n , duration , approx_pi , stdev , error
34
+
35
+ data_ns = [try_it (n , trials ) for n in Ns ]
36
+ data_trials = [try_it (maxN , trials ) for trials in range (5 ,20 ,2 )]
0 commit comments