mirror of
https://github.com/Balshgit/different
synced 2025-09-11 02:50:41 +03:00
48 lines
1.4 KiB
Python
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)
|