Forum debian-fr.org

Rechercher:

* Connexion   * M’enregistrer

* FAQ    * Rechercher





Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 
Auteur Message
 Sujet du message: [python] nombres aléatoire
MessagePosté: 05 Avr 2012 19:05 
Hors ligne
Nouvel utilisateur
Avatar de l’utilisateur

Inscription: 11 Fév 2011 23:39
Messages: 61
Localisation: Planète Terre
Avé à tous,

Je cherche une fonction de la bibliothèque de python qui renvoie un nombre aléatoire choisie dans une liste de nombre mais suivant une loi de probabilité non uniforme. Par exemple elle choisi au hasard 0, 1 ou 5 avec la probabilité de choisir 0 qui est égale à 0.6, celle de 1 est de 0.3 et celle de 5 est de 0.1 .

Merci d'avance

_________________
Debian wheezy 64bits, i5, optimus (intel + nvidia), noyaux 3.6.9


Haut
 Profil  
 
MessagePosté: 05 Avr 2012 20:08 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4034
Dans ce genre de cas, le principe c'est de générer un ensemble d'éléments qui correspond à ta distribution, puis de prendre un élément au hasard dans cet ensemble.

Pour l'exemple que tu as donné :
Code:
probas = [0, 0, 0, 0, 0, 0, 1, 1, 1, 5]
element = random.choice(probas)

Évidemment c'est pas super pratique pour définir ta distribution, on voudrait plutôt quelque chose du genre :
Code:
probas = { 0: 0.6,
           1: 0.3,
           5: 0.1,
         }

Il faut donc transformer le dictionnaire en liste tout en respectant la distribution. Je te laisse le soin de chercher (indice : c'est vachement plus simple de spécifier la fréquence sous forme de nombre entier dans le dictionnaire), demande si tu ne trouves pas. ;)

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 05 Avr 2012 21:34 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 25 Avr 2006 10:30
Messages: 1571
Localisation: grenoble
avec R je procède ainsi:

import numpy
X=[0,1,5]
n=[6,3,1]
x=numpy.repeat(X,n)

tu génères ensuite un nombre aléatoire entre 0 et sum(n)-1

_________________
I love vim


Haut
 Profil  
 
MessagePosté: 05 Avr 2012 21:35 
Hors ligne
Nouvel utilisateur

Inscription: 29 Sep 2011 18:08
Messages: 6
SciPy pourrait répondre à tes besoins, si ta loi est connue/classique, à travers le paquet scipy.stats: http://docs.scipy.org/doc/scipy/referen ... stats.html et http://docs.scipy.org/doc/scipy/reference/stats.html


Haut
 Profil  
 
MessagePosté: 05 Avr 2012 22:08 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4034
limax a écrit:
import numpy
X=[0,1,5]
n=[6,3,1]
x=numpy.repeat(X,n)

Effectivement avec numpy c'est plus simple que le one-liner que j'avais trouvé (mais faut charger numpy quoi). :mrgreen:
Code:
probas = { 0: 6,
           1: 3,
           5: 1,
         }
probas = [x for inner in [[k]*v for k,v in probas.items()] for x in inner]



limax a écrit:
tu génères ensuite un nombre aléatoire entre 0 et sum(n)-1

C'est exactement ce que fait random.choice() au final. ;)

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 06 Avr 2012 08:26 
Hors ligne
Vraiment, particulièrement bavard(e)!
Avatar de l’utilisateur

Inscription: 25 Avr 2006 10:30
Messages: 1571
Localisation: grenoble
syam a écrit:
mais faut charger numpy quoi). :mrgreen:

C'était juste pour amener une deuxième méthode, je ne conteste pas ce que tu écris.
sinon c'est vrai j'utilise random.choice comme toi.

_________________
I love vim


Haut
 Profil  
 
MessagePosté: 06 Avr 2012 09:10 
Hors ligne
Modérateur du forum
Avatar de l’utilisateur

Inscription: 18 Mai 2009 16:49
Messages: 4034
limax a écrit:
C'était juste pour amener une deuxième méthode, je ne conteste pas ce que tu écris.

Non mais c'est très bien numpy aussi. Ça a l'avantage d'être beaucoup plus clair. :)
Le seul truc qui me chiffonne un peu dans ce que tu as écrit c'est de déclarer les éléments et leurs fréquences dans des variables différentes (ça peut plus facilement engendrer des erreurs) mais ce n'est pas bien méchant, on peut tout à fait utiliser un dictionnaire là aussi :
Code:
import numpy, random
probas = { 0: 6,
           1: 3,
           5: 1,
         }
probas = numpy.repeat(probas.keys(), probas.values())
element = random.choice(probas)

_________________
testing/unstable (amd64) sous KDE4
github/syam44 - De la bonne manière de poser les questions - Wiki debian-fr
Just because you're paranoid doesn't mean they aren't after you. -- J.Heller


Haut
 Profil  
 
MessagePosté: 06 Avr 2012 10:48 
Hors ligne
Nouvel utilisateur
Avatar de l’utilisateur

Inscription: 11 Fév 2011 23:39
Messages: 61
Localisation: Planète Terre
Merci pour vos réponses, j'aime bien la dernier méthode de syam.

_________________
Debian wheezy 64bits, i5, optimus (intel + nvidia), noyaux 3.6.9


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 

Index du forum » Divers » Programmation


Qui est en ligne

Utilisateurs parcourant ce forum: MicP et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Aller à:  
Flux RSS Flux RSS Liste des flux Liste des flux
Powered by phpBB® Forum Software © phpBB Group
Traduction par: phpBB-fr.com
SEO
[ Time : 0.065s | 15 Queries | GZIP : Off ]