XL 2021 tirage au sort aléatoire sans doublon

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

aubaluc

XLDnaute Nouveau
bonjour
je me penche vers vous car je sèche sur un problème que je vais essayer de vous expliquer clairement
je souhaite effectuer un tirage au sort de 2 tours avec 40 équipes maximum ( le nombre peut être différent )
il faut que dans les 2 tirages il n'y ait pas de doublon c'est à dire que dans chaque match 2 équipes ne se rencontrent pas
j'ai essayé avec la formule ALEA mais je ne suis pas certain de ne pas avoir de doublon
je pense qu'avec une macro se serai plus certain
je vous mets en pièce jointe l'exemple
merci d'avance à celles ou ceux qui voudront bien me dépanner
aubaluc
 

Pièces jointes

Bonjour
a priori faire un tirage au sort sans doublons en vba n'est pas très compliqué j'ai une méthode imparable pour ça et sans dico
ce qui l'ai plus en revanche ce sont tes tableaux equipe/match
apprenez à conceptualiser votre intention avant de poser une question
expliquez ce que veut dire le tableau et le contexte
Patrick
 
un essai avec la méthode "Berger"
dans le TS de la colonne, on ajoute les noms des joueurs, si le nombre est impair, un "Bye" sera ajouté.
Poussez le bouton macro et le résultat est une compétition (dont vous demandez seulement les 2 premiers jours) aller-retour avec autant de joueurs.
 

Pièces jointes

Bonjour

Une solution avec une formule et un raccourci CTRL Shift T qui lance une macro qui fige le résultat de tous les onglets dont le nom commence par TIRAGES

Mai il serait sans doute plus lisible de lister les joueurs correspondants pour chaque match...
1770116508562.png
 

Pièces jointes

Dernière édition:
re
même si le tirage au sort est bon je ne vois rien de cohérent dans ce tableau
1770116430969.png

la colonne equipes devrait être colonne joueurs
la colonne 1 cohérent id des joueurs
la colonne C avec le tirage veux dire quoi ? car la on a seulement changé l'ordre de la A dans C
autrement dit la colonne C ne correspond plus au joueurs
donc avec C tu fait quoi ?
 
@fanfan38
tu tourne un peu to much pour 40 places dans le désordre
VB:
For i = 1 To NbTirages
        Do
            Tirage = Int((Max - Min + 1) * Rnd + Min)
            nbtours = nbtours + 1
        Loop Until Not dico.Exists(Tirage)
        
        dico.Add Tirage, Tirage
    Next i
pour info regarde combien tu pédale pour 40 places dans le desordre (avec 2 boucles,un dico,et une transposition)
ce coup ci 152 des fois c'est plus des fois c'est moins

demo4.gif


regarde combien je pedale pour 40 places dans le desordre sans dico ,une seule boucle,pas de transposition
je n'ai besoins que d'autant de tours que le nombre total de place
demo4.gif


le chemin le plus court pour mettre une liste dans le désordre sans doublons est le mélange
quand tu mélange les cartes elles se doublent pas ben là non plus

VB:
Sub test()
    'auteur:     patricktoulon
    Dim Matrice, index&, index2&, memo&
    Matrice = [ROW(1:40)]
    For index = 1 To UBound(Matrice)
        index2 = 1 + (Rnd * (UBound(Matrice) - 1))
        memo = Matrice(index, 1)
        Matrice(index, 1) = Matrice(index2, 1)
        Matrice(index2, 1) = memo
        nbtours = nbtours + 1
    Next
    Range("C3").Resize(UBound(Matrice), 1).Value = Matrice
    MsgBox nbtours & " tours de boucle dans le moulin sans doublons avec une seule boucle et sans dico sans transposition "
End Sub
 
re
@Dranreb : entre 120 et 150 millisecondes
c'est encore finalement toute ton attirail qui l'accompagne qui te ralenti finalement
et le must c'est que dans ta classe tu utilise le même principe que moi finalement dans ta classe
Code:
Public Sub Désordre()
Rem. Méthode. Change aléatoirement l'ordre des numéros.
   Dim P As Long, R As Long, J As Long
   Rem. Algorithme du mélange de Fisher-Yates.
   For P = PMax To 2 Step -1
      R = Int(Rnd * P) + 1: J = Joueur(R): Joueur(R) = Joueur(P): Joueur(P) = J
      Next P
   RectifierPositions
   End Sub

@fanfan38 :entre 120 et 350 milliseconde(tout dépend de combien de fois le do/loop dico doit recommencer)
@chris :c'est en formule difficile de mesurer
@patricktoulon: entre 15 et 25 millisecondes
 
La méthode Init de mon objet ListeAleat n'utilise pas sa méthode Désordre pour éviter une passe d'initialisation de 1 à Nombre.
Le processus de tirage proprement dit prend généralement moins de 200 microsecondes chez moi, avec ces 40 joueurs, 2 manches. C'est affiché.
 
re
Ta conversion n'est pas bonne, tu dit microsecondes mais c'est millisecondes(testé en comparaison avec le timer vba) qui donne a peu près la même chose à l'echelle
  • 1 milliseconde (ms) = 1/1000 de seconde
  • 1 microseconde (µs) = 1/1 000 000 de seconde uniquement api
  • 1 nanoseconde (ns)=1/1000 000 000 de seconde uniquement api
marge d'erreur
avec 5 à 7% de plus pour les api (en comptant les thick)
avec 10 as 15% de plus pour le timer

200 microsecondes ; si c’était vraiment le cas le timer de VBA me donnerait zero car il ne descend pas jusque là
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
375
Réponses
5
Affichages
1 K
Réponses
2
Affichages
845
Réponses
6
Affichages
929
Réponses
30
Affichages
3 K
Réponses
6
Affichages
833
Réponses
13
Affichages
4 K
Retour