Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tirage au sort pondéré

6 réponses
Avatar
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

6 réponses

Avatar
Tanguy Ortolo
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
Avatar
rejoc
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()))
Avatar
Maïeul
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-
Avatar
Maïeul
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-
Avatar
Tanguy Ortolo
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
Avatar
Maïeul
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-