Tirage au sort pondéré

Le
Maïeul
Bonjour,

j'aimerais faire un tirage au sort pondéré.
Je m'explique. Prenons le dico suivant {"A":1,"B":2}
J'aimerais faire un "tirage au sort" tel P(A) = 1/3 et P(B)=2/3

Je n'ai pas trouvé dans le module random de quoi faire directement un
tel tirage au sort. Savez vous si une telle fonction existe, avant que
je dev la mienne ?

Merci d'avance
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Tanguy Ortolo
Le #25631142
Maïeul, 2013-09-03 10:31+0200:
Bonjour,

j'aimerais faire un tirage au sort pondéré.
Je m'explique. Prenons le dico suivant {"A":1,"B":2}
J'aimerais faire un "tirage au sort" tel P(A) = 1/3 et P(B)=2/3

Je n'ai pas trouvé dans le module random de quoi faire directement un
tel tirage au sort. Savez vous si une telle fonction existe, avant que
je dev la mienne ?



Je ne sais pas si ça existe, mais j'ai des idées pour en coder une. Je
construirais un dictionnaire inversé, indexé par les poids cumulés, soit
dans ton cas :
{1: 'A', 3: 'B'}

Ensuite, tirer un flottant aléatoire entre zéro et le total, ici trois,
puis parcourir les clefs du dictionnaire et sortir avec la valeur
associée à la première clef qui dépasse de la valeur tirée.

--
. o .
. . o Tanguy
o o o
rejoc
Le #25631282
Le 03/09/2013 10:31, Maïeul a écrit :
Bonjour,

j'aimerais faire un tirage au sort pondéré.
Je m'explique. Prenons le dico suivant {"A":1,"B":2}
J'aimerais faire un "tirage au sort" tel P(A) = 1/3 et P(B)=2/3

Je n'ai pas trouvé dans le module random de quoi faire directement un
tel tirage au sort. Savez vous si une telle fonction existe, avant que
je dev la mienne ?

Merci d'avance


Un tirage sur une liste qui contiendrait par exemple : ['A', 'B', 'B'] ?

l = list(itertools.chain.from_iterable([k]*v for k, v in dico.items()))
Maïeul
Le #25631792
Le 03.09.13 13:45, rejoc a écrit :
Le 03/09/2013 10:31, Maïeul a écrit :
Bonjour,

j'aimerais faire un tirage au sort pondéré.
Je m'explique. Prenons le dico suivant {"A":1,"B":2}
J'aimerais faire un "tirage au sort" tel P(A) = 1/3 et P(B)=2/3

Je n'ai pas trouvé dans le module random de quoi faire directement un
tel tirage au sort. Savez vous si une telle fonction existe, avant que
je dev la mienne ?

Merci d'avance


Un tirage sur une liste qui contiendrait par exemple : ['A', 'B', 'B'] ?

l = list(itertools.chain.from_iterable([k]*v for k, v in dico.items()))


oui c'est un peu près ce que j'ai fait ...
Mais je demandais si une fonction "directe" existait.

--
Maïeul Rouquette
http://geekographie.maieul.net/-LaTeX-
Maïeul
Le #25631842
Le 03.09.13 13:08, Tanguy Ortolo a écrit :
Maïeul, 2013-09-03 10:31+0200:
Bonjour,

j'aimerais faire un tirage au sort pondéré.
Je m'explique. Prenons le dico suivant {"A":1,"B":2}
J'aimerais faire un "tirage au sort" tel P(A) = 1/3 et P(B)=2/3

Je n'ai pas trouvé dans le module random de quoi faire directement un
tel tirage au sort. Savez vous si une telle fonction existe, avant que
je dev la mienne ?



Je ne sais pas si ça existe, mais j'ai des idées pour en coder une. Je
construirais un dictionnaire inversé, indexé par les poids cumulés, soit
dans ton cas :
{1: 'A', 3: 'B'}

Ensuite, tirer un flottant aléatoire entre zéro et le total, ici trois,
puis parcourir les clefs du dictionnaire et sortir avec la valeur
associée à la première clef qui dépasse de la valeur tirée.



J'ai opté pour la solution "produire une liste avec x element de chaque
valeur" et tirer au sort dedans. A mon avis plus rapidement en terme de
perf.

--
Maïeul Rouquette
http://geekographie.maieul.net/-LaTeX-
Tanguy Ortolo
Le #25633212
Maïeul, 2013-09-03 17:34+0200:
J'ai opté pour la solution "produire une liste avec x element de chaque
valeur" et tirer au sort dedans. A mon avis plus rapidement en terme de
perf.



Probablement, mais je ne sais pas, ça dépend comment les listes sont
implémentées en Python. En revanche, c'est moins générique, ça ne marche
qu'avec des poids entiers, et pas trop grands sinon ça fait une liste
délirante.

--
. o .
. . o Tanguy
o o o
Maïeul
Le #25633612
Le 04.09.13 11:11, Tanguy Ortolo a écrit :
Maïeul, 2013-09-03 17:34+0200:
J'ai opté pour la solution "produire une liste avec x element de chaque
valeur" et tirer au sort dedans. A mon avis plus rapidement en terme de
perf.



Probablement, mais je ne sais pas, ça dépend comment les listes sont
implémentées en Python. En revanche, c'est moins générique, ça ne marche
qu'avec des poids entiers, et pas trop grands sinon ça fait une liste
délirante.



oui, effectivement dans mon cas présent c'est fonctionnel. Pas forcément
tout le tps.

--
Maïeul Rouquette
http://geekographie.maieul.net/-LaTeX-
Publicité
Poster une réponse
Anonyme