Histogramme aléatoire

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

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)