• [^] # Re: Mais où sont passés les 17% et 20%

    Posté par . En réponse au journal Un article de "Pour la science" m'ayant amené à coder pour une petite vérification perso.... Évalué à 2.

    Pour moi Les 20% et 17% sont choisis parce : (1+0.2)x(1-0.17) est très proche de 1 mais en dessous : 0.996
    ce qui amène l'appauvrissement inexorable du pauvre -> oligarchie
    avec les données que tu prends dans ton exemple (RATE=0.2, DRATE=0.05) on obtient 25% et 15%, en refaisant le calcul (1+0.25)x(1-0.15) on obtient 1.06 bien au dessus de 1 le pauvre a tendance à s'enrichir il n'y aura pas d'oligarchie.
    D'ailleurs avec le script "corrigé", c'est bien ce que je constate (voir ci dessous l'algo que j'utilise).

    je trouve qu'avec rate et drate c'est difficile à voir si on est en dessus ou en dessous de cette barre fatidique des "1" où tout bascule.


    L'algo (pour le cas 20%, 17 % : oligarchie assez rapide.)

    #!/usr/bin/env python3
    from random import randint
    from statistics import mean, median, pstdev
    import time
    NB_PEOPLE = 15
    AMOUNT_START = 10000
    NB_LOOP = 5000000
    RATE = 0.185
    DRATE = 0.015
    def pays(customer, seller, base):
     # no advantage for the poorest as no poorest
     if seller == customer:
     customer -= base * RATE
     seller += base * RATE
     # poorest receive the money so add DRATE in the transfer
     elif seller < customer:
     customer -= base * (RATE + DRATE)
     seller += base * (RATE + DRATE)
     # poorest pay the money so deduct DRATE in the transfer
     else:
     customer -= base * (RATE - DRATE)
     seller += base * (RATE - DRATE)
     return customer, seller
    people = [AMOUNT_START] * NB_PEOPLE
    timestamp = time.time()
    for _ in range(0, NB_LOOP):
     # select two random people
     a = randint(0, NB_PEOPLE - 1)
     b = a
     while a == b:
     b = randint(0, NB_PEOPLE - 1)
     base = min(people[a], people[b])
     people[a], people[b] = pays(people[a], people[b], base)
     if time.time() - timestamp >= 0.5:
     print(f"people: {', '.join(str(round(p,2)) for p in people)} ",end='\r')
     timestamp = time.time()
    # final, show the results
    print(f"people: {', '.join(str(round(p,2)) for p in people)}")
    print(f"Last tranfert base: {round(base)}")
    print(f"avg: {mean(people)} | median: {round(median(people))} | pstdev: {round(pstdev(people))}")

    avec ta proposition

    RATE = 0.2
    DRATE = 0.005
    

    pas d'oligarchie