Sans aucune animosité, je me permet simplement quelques remarques sur le style du code:
# -*- coding: utf8 -*-
C’est un vieux truc qui n’a plus aucun intérêt.
from random import *
C’est en général pas conseillé d’importer *, il vaut mieux soit importer le module et utiliser module.fonction soit importer les fonctions dont tu as besoin.
people=[]# first setting NB_PEOPLE people with the same amount of money (AMOUNT_START)whilei<NB_PEOPLE:people.append(AMOUNT_START)i+=1
L’initialisation de la variable people peut être réduite à people = [AMOUNT_START] * NB_PEOPLE
i=0a=0b=0base=0
Tu n’as pas besoin d’initialiser toutes tes variables globalement en Python.
while i<NB_LOOP :
En général en Python on utilise des boucles for plutôt que while : for _ in range(0, NB_LOOP + 1): (tu n’utilise pas la variable i, autant ne pas lui donner de nom)
if c>0.5 : # a pays b
Il me semble que les deux blocks font la même chose, avec les signes inversés, du coup une fonction pays(a, b, base) où tu inverse a et b et qui renvoie la nouvelle valeur de a et b devrait faire l’affaire non ?
Genre people[a], people[b] = pays(a, b, base) ou people[b], people[a] = pays(b, a, base).
while i<NB_PEOPLE :
Idem que précédemment, mais en plus tu peux directement itérer sur people for person in people:, mais le mieux c’est surtout d’utiliser str.join() : final = ", ".join(str(p) for p in people).
final="Last tranfert base : " + str(base) +". "
On utilise plutôt les f-string, str.format() ou les %-string plutôt que la concaténation pour faire ça en général : print(f"Last tranfert base : {base}. {', '.join(str(p) for p in people)}")
Après avoir appliquer ça (et utilisé black pour le formatage), ça donne quelque chose comme ça :
#!/usr/bin/python3fromrandomimportrandom,randintNB_PEOPLE=500AMOUNT_START=2000NB_LOOP=5000000RATE=0.2DRATE=0.05defpays(a,b,base):# no advantage for the poorest as no poorestifa==b:a=a-base*RATEb=b+base*RATE# poorest receive the money so add DRATE in the transferelifa>b:a=a-base*(RATE+DRATE)b=b+base*(RATE+DRATE)# poorest pay the money so deduct DRATE in the transferelse:a=a-base*(RATE-DRATE)b=b+base*(RATE-DRATE)returna,bpeople=[AMOUNT_START]*NB_PEOPLEfor_inrange(0,NB_LOOP+1):# select two random peoplea=randint(0,NB_PEOPLE-1)b=randint(0,NB_PEOPLE-1)# compare the capital of both and select the base for the calculation for the next# step (capital of the poorest)ifpeople[a]<people[b]:base=people[a]else:base=people[b]# a pays bifrandom()>0.5:people[a],people[b]=pays(a,b,base)# b pays aelse:people[b],people[a]=pays(b,a,base)# final, show the reslutsprint(f"Last tranfert base : {base}. {', '.join(str(p) for p in people)}")
Cela dit, ma fonction pays() doit pas être bonne, j’obtiens des résultats qui m’ont l’air bien différent de ton code.
# Python
Posté par Anonyme . En réponse au journal Un article de "Pour la science" m'ayant amené à coder pour une petite vérification perso.... Évalué à 6.
Sans aucune animosité, je me permet simplement quelques remarques sur le style du code:
C’est un vieux truc qui n’a plus aucun intérêt.
C’est en général pas conseillé d’importer
*, il vaut mieux soit importer le module et utilisermodule.fonctionsoit importer les fonctions dont tu as besoin.L’initialisation de la variable
peoplepeut être réduite àpeople = [AMOUNT_START] * NB_PEOPLETu n’as pas besoin d’initialiser toutes tes variables globalement en Python.
En général en Python on utilise des boucles
forplutôt quewhile:for _ in range(0, NB_LOOP + 1):(tu n’utilise pas la variablei, autant ne pas lui donner de nom)Il me semble que les deux blocks font la même chose, avec les signes inversés, du coup une fonction
pays(a, b, base)où tu inverse a et b et qui renvoie la nouvelle valeur de a et b devrait faire l’affaire non ?Genre
people[a], people[b] = pays(a, b, base)oupeople[b], people[a] = pays(b, a, base).Idem que précédemment, mais en plus tu peux directement itérer sur people
for person in people:, mais le mieux c’est surtout d’utiliserstr.join():final = ", ".join(str(p) for p in people).On utilise plutôt les f-string,
str.format()ou les %-string plutôt que la concaténation pour faire ça en général :print(f"Last tranfert base : {base}. {', '.join(str(p) for p in people)}")Après avoir appliquer ça (et utilisé black pour le formatage), ça donne quelque chose comme ça :
Cela dit, ma fonction
pays()doit pas être bonne, j’obtiens des résultats qui m’ont l’air bien différent de ton code.