Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

HISTOGRAMME ALÉATOIRE


Description

Cliquez pour voir la capture en taille normale
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

  • # -*- 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"
# -*- 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.
 

Commentaires et avis

signaler à un administrateur
Commentaire de wkenw le 03/11/2008 09:40:40

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.

signaler à un administrateur
Commentaire de bastelmann le 16/11/2008 00:00:30

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^^

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

scrollbar dans scrollbox avec TKinter [ par MHI ] Est-ce que quelqu'un sait comment ajouter les scrollbar à une scrollbox :J'ai essayé ceci :lstFile = Tkinter.Listbox(frmMain)lstFile.place(x = 20, y = checkButton avec TKinter [ par MHI ] comment faire pour tester si un checkButton est coché ? Probleme avec TKinter [ par titasse ] Bonjour, je debute en python. J'ai un probleme lorsque je veux importer TKinter avec la commande from TKinter import * j'ai le message suivant : Imp au sujet de Tkinter et le module turtle [ par nico1900 ] from turtle import *forward(120)left(90)&nbsp;color('red')&nbsp;forward(80)bon en fait je voulais tester le module turtle&nbsp;avec&nbsp;l e code ci-d Un Canvas comme dans Tkinter, mais pour wxPython [ par samurize ] Slt tout le monde. &nbsp; Voila tout est dans le titre (ou a peu pres&nbsp; ) : &nbsp; Je suis &#224; la recherche d'un module pouvant s'integrer da Taille de widgets sous Tkinter [ par Uims ] Bonjour, Quelqu"un saurait comment definir la taille d'un widgets sous tkinter??? Exemple: fen 1 = Tk(taille=600) J'espere que je me fait comprend Ouverture d'un fichier windows (avec Tkinter) [ par Uims ] Bonjour, Je travaille sous python et Tkinter et j'aurai voulu savoir comment dire a python de demarrer (comme on clique sur un fichier) une applicati Tkinter et Python [ par Telimektar1er ] Voila j'ai commenc&#233; e python il y a une semaine et jusqu &#224; aujourd'hui aucun probl&#232;me. Mais voil&#224;, je viens de commencer la cr&#23 help, faire un mastermind en python et en tkinter avant le 24 !!! [ par Crick132 ] je suis &#233;tudiante en 2&#232;me ann&#233;e, je dois r&#233;aliser un mastermind en python avec 8 couleurs et 5 combinaisons possibles.si quelqu'un Importer une image dans Tkinter... [ par skools ] Bonjour à tous, Et pardon à ceux à qui j'ai envoyé des messages perso, je n'arrivais pas à poster un suget dans le forum... Voilà, après des heures d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.