[python] nombres aléatoire

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

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é :

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 :

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. :wink:

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

SciPy pourrait répondre à tes besoins, si ta loi est connue/classique, à travers le paquet scipy.stats: docs.scipy.org/doc/scipy/reference/stats.html

[quote=“limax”]import numpy
X=[0,1,5]
n=[6,3,1]
x=numpy.repeat(X,n)[/quote]
Effectivement avec numpy c’est plus simple que le one-liner que j’avais trouvé (mais faut charger numpy quoi). :mrgreen:

probas = { 0: 6, 1: 3, 5: 1, } probas = [x for inner in [[k]*v for k,v in probas.items()] for x in inner]

C’est exactement ce que fait random.choice() au final. :wink:

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.

Non mais c’est très bien numpy aussi. Ça a l’avantage d’être beaucoup plus clair. :slightly_smiling:
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 :

import numpy, random probas = { 0: 6, 1: 3, 5: 1, } probas = numpy.repeat(probas.keys(), probas.values()) element = random.choice(probas)

Merci pour vos réponses, j’aime bien la dernier méthode de syam.