XL 2016 Tirage au sort avec conditions

Pistoufle12

XLDnaute Junior
Bonjour

J'ai besoins de vous pour organiser un tirage au sort avec conditions !

J'ai regarder sur le forum mais j'arrive pas a retrouver le même style de problématique

J'ai réussi à faire un tirage au sort simple de 12 concurrents (c'est pour les duel des demi finale on qualifie 6 finaliste ) avec une petite macro et un bouton

Mais par contre pour le tirage au sort du début de la compétition, je sèche et je fait ca à la main !

Je vous explique c'est pour des concours de pêche :

Des pécheurs (un multiple de 3) s'affrontent en duel sur un poste défini (nombre de poste =1/3 des participant) et un autre pécheur les arbitre (ca fait donc des trio)

Chacun fait 6 duels en pêche (+ 3 en tant qu'arbitre) contre des adversaires différent et cela créé un classement.
A l'issu de ce classement, je récupère les 12 premiers et je lance les phases finales mais la c'est bon !!

Le souci c'est pour automatiser le tirage des duels de départ car le nombre de pécheurs peut varier et il ne faut pas de doublon !!!!

il me faudrait :
pecheur X contre pecheur Y arbitré par pecheur Z sur poste 1
pecheur A
contre pecheur b arbitré par pecheur c sur poste 2
...

Merci d'avance de vos pistes
A bientôt
Pistoufle12

A bientôt
Christophe
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
S'il suffit qu'ils arbitrent tous une manche de chaque temps pour qu'il passent tous le même temps à pêcher (je pense que c'est en effet le cas), ça devrait pouvoir se faire au niveau de la Function TiragePêcheOK en utilisant 3 ListeAléat, un pour chaque temps, au lieu du JoueursRéserve commun, et sélectionner celui d'où on prend les arbitres en fonction du numéro de la Manche. Pouvez vous essayer de voir ça ?
Mais est-ce que ça ne va pas rigidifier les conditions où ça pourra marcher en terme de nombre de participants, de manches et tout ça ?
 

Pistoufle12

XLDnaute Junior
Bonsoir.
S'il suffit qu'ils arbitrent tous une manche de chaque temps pour qu'il passent tous le même temps à pêcher (je pense que c'est en effet le cas), ça devrait pouvoir se faire au niveau de la Function TiragePêcheOK en utilisant 3 ListeAléat, un pour chaque temps, au lieu du JoueursRéserve commun, et sélectionner celui d'où on prend les arbitres en fonction du numéro de la Manche. Pouvez vous essayer de voir ça ?
Mais est-ce que ça ne va pas rigidifier les conditions où ça pourra marcher en terme de nombre de participants, de manches et tout ça ?
Merci pour cette réponse rapide et pertinente !!
Vous avez compris c'est exactement ça !
Ca va certainement contraindre et rigidifier mais ca sera plus équitable en temps.
Je comprends votre explication et la démarche mais je ne suis pas capable de la mettre en place ...
Je vais essayer et au pire je vous enverrais un fichier ...
 

Dranreb

XLDnaute Barbatruc
Essayez, c'est rigolo. Mais gardez peut être la TiragePêcheOK au cas où, écrivez une TirageÉquitOK derrière. Elle utilisera la même procédure récursive RencTrouvée. C'est juste le processus qui retire les arbitres de chaque manche qui change.
VB:
Function TirageÉquitOK(ByVal NbJrs As Long, ByVal Manches As Long) As Boolean
   Dim X As Long, M As Long, TArbitres(1 To 3) As New ListeAléat, A As Long, Arbitres As ListeAléat, L As Long, J As Long
   UFmVisu.DescConfig NbJrs & " joueurs " & Manches & " manches."
   If NbJrs Mod 3 <> 0 Then UFmVisu.Echec "Effectif non multiple de 3": Exit Function
   MMax = Manches: LMax = NbJrs \ 3
   X = XTria(NbJrs, NbJrs - 1)
   ReDim Tirage(1 To MMax, 1 To LMax, 1 To 3), _
      JoueursManche(1 To MMax), DéjàRenc(0 To X)
   Randomize
   For M = 1 To MMax: Set JoueursManche(M) = New ListeAléat
      JoueursManche(M).Init NbJrs: Next M
   For A = 1 To 3: TArbitres(A).Init NbJrs: Next A
   For M = 1 To MMax
      Set Arbitres = TArbitres((M - 1) Mod 3 + 1)
      For L = 1 To LMax
         J = Arbitres.Aléat: If J = 0 Then UFmVisu.Echec "Arbitres ?!": Exit Function
         Arbitres.Supprimer J: JoueursManche(M).Supprimer J
         Tirage(M, L, 3) = J
         Next L, M
   NivMax = MMax * LMax - 1
   If RencTrouvée(0) Then TirageÉquitOK = True: UFmVisu.Conclure Else UFmVisu.Echec
   End Function
J'ai admis qu'il y avait une erreur dans votre message #30, où la manche 3 est indiquée à deux temps différents et la 5 pas mentionnée, et qu'il fallait considérer une répétition des 3 temps toutes les 3 manches.
Si c'est un autre ordre, il faudra Set Arbitres = TArbitres(Choose(M, 1, 1, 1, 2, 3, 2, 3, 2, 3)) par exemple, en imaginant que les 3 1ères sont des mises en bouches courtes …
 
Dernière édition:

Pistoufle12

XLDnaute Junior
Oui désolé j'ai fait une erreur dans mon message sur les temps !!

c'est bien une répétition des 3 temps :
Les manches ont un temps différent:
Manche 1 / 4 / 7 de 10 min
Manche 2 / 5 / 8 de 15 min
Manche 3 / 6 / 9 de 20 min

Merci d'avance et bonne journée
 

Dranreb

XLDnaute Barbatruc
Avez vous d'abord un peu cherché quelles modifications apporter à la procédure de tirage ?
Ça ne touche que 5 lignes de code. Dans les déclaration, 2 choses à la place JoueursRéserve As New ListeAléat: un petit tableau de 3 de ces objets : TArbitres(1 To 3) As New ListeAléat et un Arbitres As ListeAléat pour y mettre celui qu'on emploie pour chaque manche.
Pour les initialiser c'est facile: For X = 1 To 3: TArbitres(X).Init NbJrs: Next X
Après cherchez comment les utiliser pour retirer les arbitres des JoueursManche(M) avant d'exécuter la procédure récursive de tirage. Pour vérifier si c'est bon je vous ai indiqué au poste #33 le corrigé, en spoiler. Mais ne le regardez qu'après avoir un minimum cherché.
Que feriez vous si je n'étais plus là ?
 
Dernière édition:

Pistoufle12

XLDnaute Junior
Avez vous d'abord un peu cherché quelles modifications apporter à la procédure de tirage ?
Ça ne touche que 5 lignes de code. Dans les déclaration, 2 choses à la place JoueursRéserve As New ListeAléat: un petit tableau de 3 de ces objets : TArbitres(1 To 3) As New ListeAléat et un Arbitres As ListeAléat pour y mettre celui qu'on emploie pour chaque manche.
Pour les initialiser c'est facile: For X = 1 To 3: TArbitres(X).Init NbJrs: Next X
Après cherchez comment les utiliser pour retirer les arbitres des JoueursManche(M) avant d'exécuter la procédure récursive de tirage. Pour vérifier si c'est bon je vous ai indiqué au poste #33 le corrigé, en spoiler. Mais ne le regardez qu'après avoir un minimum cherché.
Que feriez vous si je n'étais plus là ?

Merci beaucoup, je vais regarder !!
Mais il vrai que sans vous je ne ferais pas grand-chose.
 

Dranreb

XLDnaute Barbatruc
Je l'ai testée à présent, pour exactement les seuls 27 participants possible. (connerie)
Édition: Ah ben si, non, ça marche aussi pour 30 voire plus ???. Ils pêchent aussi toujours 90 minutes. Y a un truc que j'ai pas pigé. Pas grave …
Mais je suppose que ça ne marche toujours qu'avec 9 manches ?… Plus sûr de rien maintenant !…
Mais pour moins de 27 aussi… Ah oui, ah oui, parce que par groupes de 3, s'ils sont moins nombreux à pêcher ils le sont d'autant moins à être arbitres, mais ils le sont toujours 3 fois dans les 9 manches ! Pour me punir de mon imbécilité je joins mon fichier dans son état actuel.
La procédure d'essai ne supporte pas plus de 36 participants, ce n'est qu'une question de mise en page. J'ai aussi dû supprimer des feuilles qui n'étaient pas de moi pour qu'il ne soit pas énorme (dans les 2 Mo) et qu'il puisse passer.
 

Pièces jointes

  • Pistoufle12.xlsm
    94 KB · Affichages: 4

Pistoufle12

XLDnaute Junior
Re bonjour et merci beaucoup ca fonctionne !!

Les temps de pêche sont équitable, bravo

Question pratique est il envisageable d'empêcher, de limiter le fait que 1 concurrent arbitre 3 manches consécutive ?
il faudrait au maxi arbitrer pas plus de 2 manches d'affilé !!

A bientôt et merci encore
 
Dernière édition:

Pistoufle12

XLDnaute Junior
ok je comprend

Ce que je comprends pas c'est que dans le tirage non équitable il n'y a jamais 3 arbitrages consécutif !

Et est ce qu'on peut forcer le fait de demander 1 arbitrage dans le premier cycle de 3 temps, 1 dans le second, 1 dans le troisième ? en gardant cette notion d'équité ?

Ou alors l'arbitrage on le détermine avant sans tirage au sort de façon forfaitaire !
le 1 er concurrent arbitre Tour 1, Tour 5 et Tour 9...
 

Dranreb

XLDnaute Barbatruc
Dans le tirage normal les arbitres sont tirés d'un seul ensemble jusqu'à son épuisement, où il est réinitialisé aléatoirement de l'ensemble des participants. Il y a assez peu de chances pour qu'ils soient arbitres sur deux manches successives puisqu'il faut pour cela que ceux du dernier tiers du précédent remplissage soient par hasard dans le 1er tiers du nouveau remplissage. Et trois c'est impossible parce qu'aucun ne peut rester dans l'un des remplissages durant 3 tours.
Oui, ça devrait pouvoir se faire, ou même en ne fixant aléatoirement que le TArbitre(1) et en forçant les deux autres aux numéros dans le même ordre mais le tiers de fin repositionné en tête et les deux autre tiers décalés d'un tiers vers la fin.
 

Statistiques des forums

Discussions
315 094
Messages
2 116 157
Membres
112 673
dernier inscrit
ìntellisoft