Histogramme aléatoire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 461 fois - Téléchargée 18 fois

Contenu du snippet

Cette source est issue d'un exercice tiré du livre "Apprendre à programmer avec Python" de Gérard Swinnen et a pour but de vérifier la bonne distribution aléatoire des chiffres entre 0 et 1 via la fonction random().

Source / Exemple :


# -*- coding: cp1252 -*-
#################################################
#*****Utilisation de la bibliothèque random*****#
#***************Version 1.1*********************#
#*************Par Bastelmann********************#
#***************29/10/2008**********************#
#################################################
from random import *
from Tkinter import *
#################################################
#***********Définition des fonctions************#
#################################################
def liste_alea(n):
    """génere une liste aléatoire"""
    s=[]
    for i in range(n):
        s.append(random())
    return s
def imprime_liste(nom_liste):
    """Imprime la liste passée en argument"""
    for i in range(len(nom_liste)):
        print nom_liste[i]
def creation_liste_compteurs(nb_fractions=10):
    """crée la liste de compteurs suivant le nombre de fractions demandé"""
    liste_compteurs=[]
    for a in (range(nb_fractions)):
        liste_compteurs.append([a,0])
    return liste_compteurs
def generation(nombre=1000):
    """Génere la séquence de chiffres de longueur demandée pas l'utilisateur"""
    s=[]
    for i in range(nombre):
        s.append([0,random()])
    return s
def calcul_frequence(liste,total):
    """calcule les fréquences respectives des différentes fractions"""
    liste_freq=[]
    indiq_freq=0
    while indiq_freq<len(liste):
        liste_freq.append(int((len(liste)*50)*liste[indiq_freq][1])/(total*1.0))
        indiq_freq=indiq_freq+1
    return liste_freq
def affiche_frequence(liste_frequence,canevas):
    """Représente les fréquences en histogramme sur le canevas"""
    liste_couleur=["black","green","violet","yellow","purple","blue","red"]
    indiq_freq=0
    while indiq_freq<len(liste_frequence):
        couleur=liste_couleur[randint(0,6)]
        canevas.create_rectangle(20*indiq_freq+1,100,20*indiq_freq+20,100-liste_frequence[indiq_freq],fill=couleur)
        indiq_freq=indiq_freq+1
def bouton_affiche_frequence():
    """Change la couleur de l'histogramme lorsqu'on clique sur le bouton"""
    affiche_frequence(histo,can)
#################################################
#**********Début du programme général***********#
#################################################
try :
    nombre=raw_input("Combien de nombres générés souhaitez vous? ")#On demande à l'utilisateur ses conditions
    if nombre!='':#gestion des valeurs par défaut
        nombre=int(nombre)
    elif nombre=='':
        nombre=10000
    if nombre>1000000:
        print "Le nombre choisi est trop grand"
        quit()
    nb_fraction=raw_input("En combien voulez vous partitionner l'intervalle [0,1] ?")
    if nb_fraction !='':#gestion des valeurs par défaut
        nb_fraction=int(nb_fraction)
    elif nb_fraction =='':
        nb_fraction=10
    if nb_fraction>50:
        print "Le nombre choisi est trop grand"
        quit()
    liste_test=generation(nombre)#on initialise les listes
    compteurs=creation_liste_compteurs(nb_fraction)
    c,a,fraction=0,0,1.0/nb_fraction#on initialise les compteurs
#################################################
#*********Traitement de la liste****************#
#################################################  
    while c <=1:
        i=len(liste_test)-1
        while i>=0:
            if liste_test[i][0]==0:
                if liste_test[i][1]>c and liste_test[i][1]<=(c+fraction):
                    compteurs[a][1]=compteurs[a][1]+1 #Si le chiffre appartient a l'intervalle sélectionné, on incrémente le compteur correspondant
                    liste_test[i][0]=1#On marque le chiffre comme déja traité
            i=i-1
        c=c+fraction#on passe à l'intervalle suivant
        a=a+1
    print "***************************************"
    imprime_liste(compteurs)#On affiche le résultat
    print "***************************************"
#################################################
#*********Initialisation de l'affichage*********#
#################################################
    liste_couleur=["black","green","violet","yellow","purple","blue","red"]
    fenetre=Tk()
    fenetre.title("Histogramme des fréquences")
    can=Canvas(fenetre, width =20*nb_fraction+1, height =100+1, bg ='white')
    can.grid(row=1,column=1,columnspan=nb_fraction)
    Button(fenetre,text="Quitter",command=fenetre.destroy).grid(row=3,column=1,columnspan=nb_fraction)

#################################################
#***********Affichage des fractions*************#
#################################################
    a=1
    while a<nb_fraction+1:
        Label(fenetre,text=a).grid(row=2,column=a)
        a=a+1
#################################################
#***********Affichage des fréquences************#
#################################################
    histo=calcul_frequence(compteurs,nombre)
    affiche_frequence(histo,can)
    Button(fenetre,text="Couleur",command=bouton_affiche_frequence).grid(row=4,column=1,columnspan=nb_fraction)
    fenetre.mainloop()
#################################################
#************Gestion des exceptions*************#
#################################################
except IndexError:
    print "Erreur d'indexation de la liste"
except ValueError:
    print "Vous n'avez pas rentré un chiffre correct"
except:
    print "Erreur indéterminée"

Conclusion :


J'attend vos remarques quant à cette source, qui je pense peut être améliorée.

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
16 novembre 2008

Il est vrai que l'on peut également procéder ainsi, mais une des consignes concernant la réalisation de cette fonction était d'utiliser la méthode append().
Et vu que je débute, je préfère bien détailler pour le moment, afin de pouvoir me relire plus facilement^^
Messages postés
19
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 août 2009

Un des intérêts de Python est la concision.
Ainsi liste_alea(n) pourrait être remplacée par [random() for i in range(n)].
De même pour nombre d'autres fonctions dans ton code.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (bastelmann)