• [^] # Re: Python

    Posté par (site web personnel) . En réponse au journal Un article de "Pour la science" m'ayant amené à coder pour une petite vérification perso.... Évalué à 2. Dernière modification le 21 juillet 2021 à 09:47.

    Pourtant si je regarde ce que vaut customer + seller à l'entrée de la fonction pays et à la sortie, cette quantité est invariante.

    Pour en avoir le cœur net j'ai écrit une alternative à pays qui met cela bien en évidence:

    def pays(customer, seller, base):
     amount = 0
     # no advantage for the poorest as no poorest
     if seller == customer:
     amount = base * RATE
     # poorest receive the money so add DRATE in the transfer
     elif seller > customer:
     amount = base * (RATE + DRATE)
     # poorest pay the money so deduct DRATE in the transfer
     else:
     amount = base * (RATE - DRATE)
     return (seller + amount, customer - amount)
    

    et ajouté des print dans le programme pour tracer:

    for _ in range(0, NB_LOOP):
     # select two random people
     a = randint(0, NB_PEOPLE - 1)
     b = randint(0, NB_PEOPLE - 1)
    

    base = min(people[a], people[b])
    ``` invariant1 = people[a] + people[b]
    print(f"1st people[a], people[b] {people[a]}, {people[b]}")
    u, v = pays2(people[a], people[b], base)
    print(f"u,v ={u}, {v}")
    people[a], people[b] = u, v
    print(f"2nd people[a], people[b] {people[a]}, {people[b]}")
    invariant2 = people[a] + people[b]
    assert(invariant1 == invariant2)
    ~~~

    et ça me fait un truc du genre:

    1st people[a], people[b] 2000, 2000
    u,v =2400.0, 1600.0
    2nd people[a], people[b] 2400.0, 1600.0
    1st people[a], people[b] 1600.0, 2000
    u,v =2400.0, 1200.0
    2nd people[a], people[b] 2400.0, 1200.0
    1st people[a], people[b] 2000, 2000
    u,v =2400.0, 1600.0
    2nd people[a], people[b] 2400.0, 1600.0
    1st people[a], people[b] 2400.0, 1200.0
    u,v =1380.0, 2220.0
    2nd people[a], people[b] 1380.0, 2220.0
    1st people[a], people[b] 2000, 2000
    u,v =2400.0, 1600.0
    2nd people[a], people[b] 2400.0, 1600.0
    1st people[a], people[b] 2400.0, 2400.0
    u,v =2880.0, 1920.0
    2nd people[a], people[b] 2880.0, 1920.0
    1st people[a], people[b] 2000, 2880.0
    u,v =3380.0, 1500.0
    2nd people[a], people[b] 3380.0, 1500.0
    1st people[a], people[b] 1920.0, 2400.0
    u,v =2880.0, 1440.0
    2nd people[a], people[b] 2880.0, 1440.0
    1st people[a], people[b] 1500.0, 1600.0
    u,v =1975.0, 1125.0
    2nd people[a], people[b] 1975.0, 1125.0
    1st people[a], people[b] 1600.0, 3380.0
    u,v =3780.0, 1200.0
    2nd people[a], people[b] 3780.0, 1200.0
    1st people[a], people[b] 2000, 1440.0
    u,v =1656.0, 1784.0
    2nd people[a], people[b] 1656.0, 1784.0
    1st people[a], people[b] 2000, 1200.0
    u,v =1380.0, 1820.0
    2nd people[a], people[b] 1380.0, 1820.0
    1st people[a], people[b] 1380.0, 1380.0
    u,v =1656.0, 1104.0
    2nd people[a], people[b] 1104.0, 1104.0
    Traceback (most recent call last):
     File "/Users/michael/Desktop/example.py", line 70, in <module>
     assert(invariant1 == invariant2)
    

    On voit que l'affectation de deux variables en même temps genre marche de façon bizarre dans la dernière trace: même si u et v ont les bonnes valeurs (on a 1656 +たす 1104 == 1380 +たす 1380) tout se casse la gueule quand on fait l'affectation à people[a], people[b]. Que se passe-t-il?

    PS: Mon commentaire fait foirer markdown de façon aussi magistrale qu'inattendue!