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)
~~~
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!
[^] # Re: Python
Posté par Michaël (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 fonctionpayset à la sortie, cette quantité est invariante.Pour en avoir le cœur net j'ai écrit une alternative à
paysqui met cela bien en évidence:et ajouté des print dans le programme pour tracer:
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:
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!