IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Denombrement avec Python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut Denombrement avec Python
    Bonjour

    J' essai de faire un truc très simple avec python: je simule un lancer de pièces un certain nombre de fois, et je m' intéresse au résultat de l’expérience. Mon propos est d' afficher le nombre de fois (et ultérieurement la fréquence) que l' issue de l' expérience correspond au paramètre défini (pile, face).

    Bien evidemment je me ramene a un tirage aléatoire parmi les deux premiers entiers (0 et 1) ...et cela me donen approximativement ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    def lancerIssue(e):
    		import random
    		from random import randint
    		R=[]
    		X=0
    		for i in range(1,4):
    			X=random.randint(0,1)
    			R=R+[X]
    		print(R)
    		s=0
    		for j in range(len(R)):
    			if e==R[j]:
    				s=s+R.count(e)
    		print(s)
    e prend ses valeurs dans {0,1} pour {pile, face}

    mais voila mon programme ne fait pas exactement ce que je voulais...si j' obtiens pile deux fois, le résultat qui s' affiche est 4 (cela semble logique , car je parcours le tableau du résultat et j' affiche le nombre de fois que je rencontre un élément du tableau).....voici une sortie d' ecran de l' execution de mon programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    >>> lancerIssue(0)
    [0, 1, 0]
    4
    >>> lancerIssue(1)
    [0, 0, 0]
    0
    >>> lancerIssue(1)
    [0, 0, 1]
    1
    >>> lancerIssue(1)
    [1, 0, 1]
    4
    >>> lancerIssue(1)
    [0, 1, 1]
    4
    >>> lancerIssue(1)
    [1, 0, 0]
    1
    >>> lancerIssue(1)
    [0, 0, 1]
    1
    >>> lancerIssue(1)
    [0, 0, 1]
    1
    >>> lancerIssue(1)
    [0, 1, 1]
    4
    >>> lancerIssue(1)
    [0, 1, 0]
    1
    >>> lancerIssue(1)
    [0, 0, 1]
    1
    >>> lancerIssue(1)
    [1, 0, 1]
    4
    >>> lancerIssue(1)
    [1, 1, 1]
    9
    Je comprends pourquoi cela ne fonctionne pas....mais j' ai du mal a programmer la sortie du résultat attendu...Merci de me suggérer une indication.


    Merci

  2. #2
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    Manifestement, selon la structure de mon code, je dois demander au programme de retourner la moyenne....

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    Je crois que j' ai trouvé mieux...il suffit que j' évite la boucle:
    Et cela me donne cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
     
    def lancerIssue(e):
    		import random
    		from random import randrange
    		from random import randint
    		R=[]
    		X=0
    		for i in range(1,4):
    			X=random.randint(0,1)
    			R=R+[X]
    		print(R)
    		s=0
    		s=s+R.count(e)
    		print(s)

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    Tu n'es pas obligé de "déclarer" ta variable avant de l'utiliser. Ansi ta liste de résultat peut être créée directement. Tu peux également faire une "liste compréhension", ce qui allège le code (attention, le mieux reste le plus simple, toujours):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def lancerIssue(e):
        import random
        from random import randrange
        from random import randint
     
        R = [random.randint(0,1) for i in range(3)]
        s = R.count(e)
     
        print 'Tirage: ',R
        print 'Occurence %i:' % (e),s
     
    lancerIssue(1)
    Je ne sais pas ce que tu comptes faire par la suite avec cette fonction, mais méfie toi des tirages "pseudo" aléatoires.

    Les fonctions comme random (il me semble tout du moins) sont basées sur l'horloge du PC. Tu cherches à tirer rapidement des nombres, si rapidement que d'un tirage à l'autre le temps CPU ne varie presque pas. Tu tire alors des séries de 0 et 1 et le résultat n'est plus vraiment aléatoire.

    Tu peux remarquer ce problème en faisant un large tirage (une vingtaine suffit).

    Il existe de nombreuses infos sur le sujet sur le net. Renseigne toi au cas où si tu veux mon avis.


    Ju

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Je ne sais pas ce que tu comptes faire par la suite avec cette fonction, mais méfie toi des tirages "pseudo" aléatoires.

    Les fonctions comme random (il me semble tout du moins) sont basées sur l'horloge du PC. Tu cherches à tirer rapidement des nombres, si rapidement que d'un tirage à l'autre le temps CPU ne varie presque pas. Tu tire alors des séries de 0 et 1 et le résultat n'est plus vraiment aléatoire.
    Garder à l'esprit qu'il s'agit de tirages pseudo-aléatoires est un bon conseil, mais tu te trompes si tu penses qu'ils sont basés sur l'horloge du PC. Il s'agit simplement d'une séquence périodique d'états (çàd de nombres) où chaque état est entièrement déterminé par l'état précédent. Quand un nombre est demandé au générateur (avec randint par exemple), il avance la séquence et génère une nombre à partir de l'état résultant. Toute la complexité de l'affaire est que la séquence de nombres résultante ait les caractéristiques statistiques d'une distribution aléatoire uniforme, et que la période du générateur soit très longue (2**19937-1 dans le cas de Python).

    Donc, peu importe s'il se passe très peu de temps entre deux tirages, la séquence de nombres générée est toujours la même. La seule chose qui change d'une exécution à l'autre, c'est la position initiale dans la séquence, et c'est là que peut intervenir l'horloge du PC.

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    On peut utiliser random.seed(x) pour repartir dans une nouvelle séquence aléatoire (sans argument, il reprend le temps de l'ordinateur).

    Sinon, il existe d'autres algorithmes pour générer de bonnes séquences aléatoires. En cas de besoin, j'utilise Blum Blum Shub (https://fr.wikipedia.org/wiki/Blum_Blum_Shub) qui est plus lent mais qui est très bon, au point d'être reconnu en cryptographie. Il n'est d'ailleurs pas très compliqué à programmer en Python (mes essais ici: http://python.jpvweb.com/mesrecettes...id=genalea_bbs).

  7. #7
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Merci dividee pour la précision


    J'avais déjà entendu parlé de la méthode par division de nombres premiers très grands, sans jamais avoir vu d'exemple concret.

Discussions similaires

  1. création de base mySQL avec python
    Par preacher_man dans le forum Bibliothèques tierces
    Réponses: 7
    Dernier message: 23/06/2006, 19h38
  2. Manipuler un fichier excel avec python
    Par dipajero dans le forum Général Python
    Réponses: 4
    Dernier message: 09/02/2006, 23h14
  3. cmt se connecté a oracle pour faire une requete avec python
    Par dipajero dans le forum Bibliothèques tierces
    Réponses: 6
    Dernier message: 28/12/2005, 20h22
  4. Réponses: 2
    Dernier message: 19/12/2005, 13h15
  5. Les 128 derniers bits d'un fichier en ligne avec Python ?
    Par ecocentric dans le forum Réseau/Web
    Réponses: 7
    Dernier message: 26/09/2005, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo