different/threaded_PI_count_script.py

48 lines
1.4 KiB
Python

from typing import Dict
import random
from datetime import datetime
from multiprocessing import Pool
ACCURACY = 10 ** 8 # our ACCURACY to count PI
PROC_NUMBER = 5
def dots_in_circle(n: int) -> Dict[str, int]:
inside, outside, one = 0, 0, 0
for step in range(int(ACCURACY*n/PROC_NUMBER), int(ACCURACY*(n+1)/PROC_NUMBER)):
x = random.randint(0, ACCURACY)/ACCURACY # 0 < x < 1
y = random.randint(0, ACCURACY)/ACCURACY # 0 < y < 1
# dot inside circle or outside it
if x**2 + y**2 < 1:
inside += 1
elif x**2 + y**2 == 1:
one += 1
else:
outside += 1
print(f'dots inside: {inside}, all dots: {outside}', f'On line: {one}')
return {'inside': inside, 'outside': outside, 'ONE': one}
now = datetime.now()
nums = range(0, PROC_NUMBER)
processes = Pool(processes=PROC_NUMBER)
all_dots = processes.map(dots_in_circle, nums)
processes.close()
dots_inside_circle, dots_outside_circle, dots_on_circle_line = 0, 0, 0
for item in all_dots:
dots_inside_circle += item["inside"]
dots_on_circle_line += item["ONE"]
dots_outside_circle += item["outside"]
end = datetime.now()
print('execution time (seconds):', (end-now).seconds)
print(f'dots inside: {dots_inside_circle}, dots outside: {dots_outside_circle}, On line: {dots_on_circle_line}')
print(dots_inside_circle/ACCURACY*4)