Nombre aléatoire

Joan066 a écrit :

Pourriez vous me faire un commentaire sur cette Macro , pour essayer de comprendre son fonctionnement

cordialement

Je vais tenter d'expliquer ...

Il y a 3 boucles, comme 3 poupées russes :

colonne = 1
Do
    Do
'...
        While Tirag.Count < Range("effectif")
'...
        Wend
'...
    Loop Until Range("test").Offset(0, colonne - 1) = 0
    colonne = colonne + 1
Loop Until colonne > 4

Prenons celle du milieu :

'...
        Set Tirag = CreateObject("Scripting.Dictionary")
        While Tirag.Count < Range("effectif")
            Randomize Timer
            Nbr = Int(Range("effectif") * Rnd) + 1
            Tirag(Nbr) = Nbr
        Wend
        Cells(6, colonne + 39).Resize(Tirag.Count) = Application.Transpose(Tirag.Items)

Pour chacune des 4 colonnes, nous allons faire un tirage au sort avec Randomize suivi de Rnd, le nombre Nbr qui en sort est compris entre 1 et l'effectif complet (150)

Nous allons utiliser un "dictionnaire virtuel" Tirag pour ranger ce que nous avons trouvé ... par exemple Tirage(3) a été trouvé, puis il a été trouvé une seconde fois alors il écrase le précédent ... et quand nous arrivons à ce que 150 "définitions" ont été trouvées, cela veut dire que nous avons trouvé 150 définitions différentes avec des chiffres entre 1 et 150

A ce moment c'est bon, nous avons une suite de nombres tous différents.

Application.Transpose var permettre de ranger ces valeurs dans la colonne.

Deuxième boucle :

    Do
'...
    Loop Until Range("test").Offset(0, colonne - 1) = 0

La question est : est-ce que la suite trouvée ne percute pas la précédente ? n'y a t-il pas des mêmes valeurs sur la même ligne ? Je vais donc voir la valeur des redondances (voir la formule dans excel car j'ai pris le pari d'avoir un système hybride avec du VBA et des formules de contrôle excel). S'il y a plus que zéro redondance, on recommence la première boucle uniquement opour cette nouvelle colonne jusqu'à ce qu'un tirage complet de 150 valeurs convienne ...

Tu remarqueras aussi que le test de redondances sur la première colonne est bidon puisqu'elle est seule. Mais pour la beauté du code j'ai donc forcé le test à 0 pour passer de suite à la seconde colonne.

Troisième boucle:

colonne = 1
Do
'...
    colonne = colonne + 1
Loop Until colonne > 4

On refait cela pour chacune des colonnes

et cela donne un code compact :

colonne = 1
Do
    Do
        Set Tirag = CreateObject("Scripting.Dictionary")
        While Tirag.Count < Range("effectif")
            Randomize Timer
            Nbr = Int(Range("effectif") * Rnd) + 1
            Tirag(Nbr) = Nbr
        Wend
        Cells(6, colonne + 39).Resize(Tirag.Count) = Application.Transpose(Tirag.Items)
    Loop Until Range("test").Offset(0, colonne - 1) = 0
    colonne = colonne + 1
Loop Until colonne > 4

N'oublie pas de corriger la protection qui empêche la recopie des valeurs trouvées ... et de prendre le code posté ce matin pendant la pause à 10h et des brouettes...

bonjour , même avec ton explication j'ai du mal la suivre , mais c'est très gentil de ta part d'avoir bien décortiqué la macro.

Je suis en sur le tableau pour faire des essais à toutes les plages qui pour l'instant fonctionne .

Je tiens a te remercier de ton aide a la création de mon tableau .

cordialement

Bonsoir! Steelson . Je viens de passé la soirée à tout testé et miracle tout fonctionne comme souhaité. Mes connaissances en Macro sont très limité je n’aurais pas trouvé toute ces formules tout seul.

Un grand merci pour ton aide et EXCEL-PRATIQUE, sans oublier Bydaddy154. D'une petite macro faite par Amadeus ,que je remercie également, j'ai fini mon tableau . Bien sûr, il y a des formules qui qui aurait besoin de rangement ou carrément de suppression, ce n'est pas grave, il fonctionne.

Mille mercissssssssss

Cordialement Joan066

Joan,

si maintenant tu ne souhaites pas avoir de doublets qui se répètent, voici la solution

Option Explicit
Sub tirage()
Dim Tirag As Object
Dim Nbr As Long
Dim colonne As Integer

    colonne = 1
    Do
        Columns([debut].Column + colonne - 1).ClearContents
        Do
            Do
                Set Tirag = CreateObject("Scripting.Dictionary")
                While Tirag.Count < [effectif]
                    Randomize Timer
                    Nbr = Int([effectif] * Rnd)
                    Tirag(Nbr) = Nbr
                Wend
                Cells([debut].Row, [debut].Column + colonne - 1).Resize(Tirag.Count) = Application.Transpose(Tirag.Items)
            Loop Until [test].Offset(0, colonne - 1) = 0
        Loop Until test_doublets(colonne)
        colonne = colonne + 1
    Loop Until colonne > 4

End Sub
Function test_doublets(col As Integer)
Dim doublette As Object
Dim compteur As Integer
Dim i As Integer, j As Integer, val As String
    compteur = 0
    Set doublette = CreateObject("Scripting.Dictionary")
    For i = [debut].Row To [debut].Row + [effectif] - 2 Step 2
        For j = [debut].Column To [debut].Column + col - 1
            val = Cells(i, j) & "|" & Cells(i + 1, j)
            doublette(val) = val
            val = Cells(i + 1, j) & "|" & Cells(i, j)
            doublette(val) = val
            compteur = compteur + 2
        Next
    Next
    test_doublets = IIf(doublette.Count = compteur, True, False)
    Cells([test].Row, [test].Column + 6).Resize(doublette.Count) = Application.Transpose(doublette.Items)
End Function

bonjour Steelson, vraiment désolé de faire encore appel à ta gentillesse et ta générosité mais la nouvelle Macro ne fonctionne pas , (peut être parce que je fonctionne avec Excel 2003).

Désolé pour la protection des macros ,Je croyais avoir fini avec le tableau , Hélas et j'ai oublier de les enlever.

Comme tu peut voir je ne suis pas doué avec Excel et les macros .

Merci de ton aide .

cordialement

https://www.cjoint.com/c/FCkkcH1jp0U

Tu peux vérifier dans la feuille_test que les doublettes sont uniques.

re bonjour , le fichier "essai tableau tournante pétanque " ne s'ouvre pas .

cordialement


Attention !, sur ton tableau des nbres aléatoire il y a des zéros

, . Sur mon tableau je commence a 1 et fini a 150

Merci

Cordialement

re-bonjour steelson, merci pour ta gentillesse de bien vouloirt'occuper de mon tableau .

. comment faire pour effacer et si on peut? les Nbrs à chaque tirage en fonction du nombre de participants dans la ( Feuilles_test) colonne "F", car si nous avons 150 participants (Colonne "F") dépasse les 89 lignes et arrive a 601 lignes .

A la colonne "G" je pense que je peux prolonger la colonne avec la poignet de la cellule afin de mettre la formule jusqu’à la ligne 601.

cordialement

Bonsoir,

A part les 4 "0", tout ce qui est dans cette feuille est superflu.

Tu peux modifier le test comme ceci :

Function test_doublets(col As Integer)
Dim doublette As Object
Dim compteur As Integer
Dim i As Integer, j As Integer, val As String
    compteur = 0
    Set doublette = CreateObject("Scripting.Dictionary")
    For i = Range("AN6").Row To Range("AN6").Row + Range("C1") - 2 Step 2
        For j = Range("AN6").Column To Range("AN6").Column + col - 1
            val = Cells(i, j) & "|" & Cells(i + 1, j)
            doublette(val) = val
            val = Cells(i + 1, j) & "|" & Cells(i, j)
            doublette(val) = val
            compteur = compteur + 2
        Next
    Next
    test_doublets = IIf(doublette.Count = compteur, True, False)
    Sheets("Feuille_test").Range("F:F").ClearContents
    Sheets("Feuille_test").Cells(Range("test").Row, Range("test").Column + 5).Resize(doublette.Count) = Application.Transpose(doublette.Items)
End Function

j'ai juste ajouté

Sheets("Feuille_test").Range("F:F").ClearContents

oui tu peux tirer en G

Ok , je fais la modif , je teste et je confirmerai la bonne marche du tableau

cordialement

bonsoir Steelson, après des dizaines essais je viens de trouvé deux doublons . Comme tu voir sur la Feuille "Tableau tournante " il y a le numéro " 8 " deux fois et le " 20 " deux fois .

La 2eme partie le 8 contre le 20 .

La 3eme partie le 18 contre le 8 et a nouveau en 4eme partie le 20 contre le 8 .

Sur la Feuille Test il ni a pas d'erreur ? .

Quel est ce séparateur qui se trouve sur la feuille Test

merci de ton aide

Cordialement

1|7

7|1

8|20

20|8

18|8

8|18

https://www.cjoint.com/c/FCkw6B6XW0U

... Je n'aide pas beaucoup, mais j'ai l'impression que cette feuille aurait pu être produite sans macro ...

D'un autre coté, j'ai aussi l'impression que répartir les éléments d'un ensemble par pair en évitant de ressortir certaines paires est un problème NP-complet, donc non calculable, sauf à calculer toutes les possibilités ou tomber par chance dessus comme le fait cette macro ...

Sinon, pour répondre à la première question du premier post, pour obtenir une liste de nombre aléatoires :

A1=alea() B1=nb.si.(A$1:A$100;">="&A1)

A2=alea() B2=nb.si(...

A3=alea() B3=nb.si(...

Cela réparti aléatoirement des nombres entiers ...

(et pour que les couples changent à chaque tour, il suffit de faire comme une danse : en ronde, on fait avancer d'un cran toutes les moitiés de pair, mais si cela marche à chaque fois, c'est clairement moins aléatoire, c'est sûr :p)

Peuwi a écrit :

... Je n'aide pas beaucoup, mais j'ai l'impression que cette feuille aurait pu être produite sans macro ...

(et pour que les couples changent à chaque tour, il suffit de faire comme une danse : en ronde, on fait avancer d'un cran toutes les moitiés de pair, mais si cela marche à chaque fois, c'est clairement moins aléatoire, c'est sûr :p)

sans macro, en effet, c'était ma première proposition ...

et je suis d'accord aussi pour l'autre solution de "tourner", mais je m'étais dit que j'allais réellement rendre ce tirage complètement aléatoire !

une troisième consisterait en cette solution de tourner, puis d'attribuer de façon aléatoire un n° à chaque personne


Joan066 a écrit :

bonsoir Steelson, après des dizaines essais je viens de trouvé deux doublons . Comme tu voir sur la Feuille "Tableau tournante " il y a le numéro " 8 " deux fois et le " 20 " deux fois .

La 2eme partie le 8 contre le 20 .

La 3eme partie le 18 contre le 8 et a nouveau en 4eme partie le 20 contre le 8 .

Le séparateur (j'ai voulu éviter le "-" pour ne pas faire de "moins") est donc le caractère obtenu par AltGr et 6 : |

Le résultat est normal car il ne fait pas partie de la spécification !

Les 2 premières demandes étaient :

  • 150 nombres différents de 1 à 150 sur 4 colonnes
  • aucun nombre identique sur chaque ligne de la matrice AN6:AQ155 ... enfin tu parlais du "tableau" et je l'ai interprêté comme tel
et enfin

- pas de doublets reproduits plusieurs fois

maintenant : pas de chiffres identiques sur chaque ligne N6:AJ44 ...

je vais reprendre juste en basculant la contrainte "pas 2 fois le même nombre sur la ligne de la matrice AN6:AQ155" en "pas 2 fois le même nombre sur la ligne de la matrice N6:AJ44"

Pourquoi les valeurs sur fond bleu-gris sont pour toi acceptables ? elles sont bien répétées sur chaque ligne

Peut-être que je comprendrais enfin exactement ce qu'il faut faire ...

valeurs

je vais arriver (peut-être) à comprendre, je suis en train de lire différents sites dont :

http://www.labouleprovencale.fr/tirage/melee_tournante.pdf

un joueur ne peut rencontrer un autre joueur qu’une fois pendant un concours.

Il ne peut donc plus jouer ni avec ni contre et cela doit être valable quel que soit le

nombre de participants.

Steelson a écrit :

je vais arriver (peut-être) à comprendre, je suis en train de lire différents sites dont :

http://www.labouleprovencale.fr/tirage/melee_tournante.pdf

un joueur ne peut rencontrer un autre joueur qu’une fois pendant un concours.

Il ne peut donc plus jouer ni avec ni contre et cela doit être valable quel que soit le

nombre de participants.

Wow, avec une contrainte pareille, il est impossible de faire un tournois avec moins de 16 personnes, et à 16, il n'y a qu'une seule solution remplissant ce critère pour 4 matchs...

-> on fait une matrice 4x4, et la première manche prend les lignes, la seconde les colonnes, la troisième les diagonales dans un sens, la quatrième dans l'autre sens.

Impossible de tomber dessus "par hasard", la recherche prendrait environs (16!)^3 essais.

bonjour à tous , il est vrai , à la création de mon " tableau Tournante pétanque " qu'il suffisait de faire quatre colonnes de nombres aléatoire pour faire jouer les participants . Au fil des essais , je me suis rendu compte le la difficulté de faire participer les joueurs une fois avec les même partenaires . Je me suis inspiré de du fonctionnement papier et j'ai essayé de le reproduire automatiquement . Merci beaucoup pour votre patience et votre gentillesse a m'aider a faire cette réalisation .

Cordialement Joan066

Bonjour Steelson, dans c'est exemple (carré jaune) il y a deux joueurs isolés. En tout il y a 20 joueurs et deux tous seuls, donc 5 équipes de quatre joueurs. Les deux restants, pour faire jouer tous le monde, les intégrer au tournoi en les faisant jouer en tête a tête mais une seule fois par parties. Ensuite changer de joueurs pour la partie suivante et pareil pour les autres parties.

J'espère que c'est plus clair.

Merci de ta patience

Cordialement

Peuwi a écrit :
Steelson a écrit :

je vais arriver (peut-être) à comprendre, je suis en train de lire différents sites dont :

http://www.labouleprovencale.fr/tirage/melee_tournante.pdf

un joueur ne peut rencontrer un autre joueur qu’une fois pendant un concours.

Il ne peut donc plus jouer ni avec ni contre et cela doit être valable quel que soit le

nombre de participants.

Wow, avec une contrainte pareille, il est impossible de faire un tournois avec moins de 16 personnes, et à 16, il n'y a qu'une seule solution remplissant ce critère pour 4 matchs...

-> on fait une matrice 4x4, et la première manche prend les lignes, la seconde les colonnes, la troisième les diagonales dans un sens, la quatrième dans l'autre sens.

Impossible de tomber dessus "par hasard", la recherche prendrait environs (16!)^3 essais.

En effet, il faut changer de stratégie de calcul.

Du reste, j'ai fait un essai et la recherche tournait en boucle.

OK pour aligner des chiffres aléatoires en colonnes.

Mais ensuite il faut combiner toutes les valeurs de sorte que personne (aucune valeur) ne puisse se retrouver une nouvelle fois avec une autre personne (valeur) qu'elle soit partenaire ou adverse.

J'ai fait ... cela met un temps certain à trouver les combinaisons possibles. Il faut que je finalise car il semble que certaines combinaisons me manquent.

Cela va chambouler aussi le fichier car plus question de puiser dans les 4 colonnes pour organiser les tournois.

Rechercher des sujets similaires à "nombre aleatoire"