-
Notifications
You must be signed in to change notification settings - Fork 1
/
pi.py
97 lines (84 loc) · 3.16 KB
/
pi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from ast import arg
import random, time
import multiprocessing as mp
# calculer le nbr de hits dans un cercle unitaire (utilisé par les différentes méthodes)
def frequence_de_hits_pour_n_essais1(nb_iteration): # premier quart du cercle
count = 0
for i in range(nb_iteration):
x = random.random()
y = random.random()
# si le point est dans l’unit circle
if x * x + y * y <= 1: count += 1
lock.acquire()
hit.value+=count
lock.release()
def frequence_de_hits_pour_n_essais2(nb_iteration): # deuxième quart du cercle
count = 0
for i in range(nb_iteration):
x = -random.random()
y = random.random()
# si le point est dans l’unit circle
if x * x + y * y <= 1: count += 1
lock.acquire()
hit.value+=count
lock.release()
def frequence_de_hits_pour_n_essais3(nb_iteration): # quatrième quart du cercle
count = 0
for i in range(nb_iteration):
x = random.random()
y = -random.random()
# si le point est dans l’unit circle
if x * x + y * y <= 1: count += 1
lock.acquire()
hit.value+=count
lock.release()
def frequence_de_hits_pour_n_essais4(nb_iteration): # troisième quart du cercle
count = 0
for i in range(nb_iteration):
x = -random.random()
y = -random.random()
# si le point est dans l’unit circle
if x * x + y * y <= 1: count += 1
lock.acquire()
hit.value+=count
lock.release()
# Nombre d’essai pour l’estimation
if __name__ == "__main__" :
hit = mp.Value('i',0)
lock = mp.Semaphore(1)
nb_total_iteration = 2500000
temps1 = time.time()
process1 = mp.Process(target=frequence_de_hits_pour_n_essais1,args=(nb_total_iteration,))
process2 = mp.Process(target=frequence_de_hits_pour_n_essais2,args=(nb_total_iteration,))
process3 = mp.Process(target=frequence_de_hits_pour_n_essais3,args=(nb_total_iteration,))
process4 = mp.Process(target=frequence_de_hits_pour_n_essais4,args=(nb_total_iteration,))
process1.start()
process2.start()
process3.start()
process4.start()
process1.join()
process2.join()
process3.join()
process4.join()
temps2 = time.time()
print("multiprocess : ")
print("Le temps nécessaire au calcul de pi est ",temps2-temps1)
print("Valeur estimée Pi par la méthode Multi−Processus : ", hit.value / nb_total_iteration)
def frequence_de_hits_pour_n_essais(nb_iteration):
count = 0
for i in range(nb_iteration):
x = random.random()
y = random.random()
# si le point est dans l’unit circle
if x *x + y *y <= 1: count += 1
return count
# Nombre d’essai pour l’estimation
nb_total_iteration = 10000000
temps3=time.time()
nb_hits=frequence_de_hits_pour_n_essais(nb_total_iteration)
temps4 = time.time()
print("mono_process : ")
print("Le temps nécessaire au calcul de pi est ",temps4-temps3)
print("Valeur estimée Pi par la méthode Mono−Processus : ", 4 * nb_hits / nb_total_iteration)
#TRACE :
# Calcul Mono−Processus : Valeur estimée Pi par la méthode Mono−Processus : 3.1412604