import math
import random
random.seed(20)
def ustvari_funkcijo1():
    n = random.uniform(-7, 1)
    return lambda x: x + n
def ustvari_funkcijo2():
    a, b, c = random.uniform(1, 3), random.uniform(-3, 3), random.uniform(-5, -1)
    return lambda x: math.e**(a*x + b) + c
seznam_funkcij = [None] * 2000
for i in range(1000):
    seznam_funkcij[i] = ustvari_funkcijo1()
for i in range(1000, 2000):
    seznam_funkcij[i] = ustvari_funkcijo2()


def nicle_bisekcija(funkcija, a, b):
    # Ce je razlika med a in b dovolj majhna, vrnemo kar njuno sredino.
    if abs(b-a) < 0.000001:
        return (a + b) / 2
    
    vrednost_na_sredini = funkcija((a + b) / 2)
    if vrednost_na_sredini == 0:
        return (a + b) / 2
    # Ce je vrednost na sredini intervala pozitivna, iscemo niclo na levi
    # polovici intervala, sicer na desni.
    if vrednost_na_sredini > 0:
        return nicle_bisekcija(funkcija, a, (a + b) / 2)
    return nicle_bisekcija(funkcija, (a + b) / 2, b)

vsota_nicel = 0
for funkcija in seznam_funkcij:
    nicla = nicle_bisekcija(funkcija, -10, 10)
    vsota_nicel += nicla
vsota_nicel = round(vsota_nicel, 3)
print(vsota_nicel)