Macro pour un nombre aléatoire à 3 chiffres avec contraintes

Bonjour la communauté,

Dans le cadre d’un jeu pour ma classe, j’aurais besoin s’il vous plait, d’une macro qui me génère un NOMBRE ALEATOIRE A 3 CHIFFRES avec uniquement les chiffres 1 / 2 / 3 / 4 sachant que chaque chiffre ne peut être utilisé qu’une seule fois

Exemples :

123

341

234

Mais 111 / 223 / … ect ne sont pas possibles

Merci beaucoup pour votre aide !

Seb

Bonsoir,

voyez ce code :

Function aleatoire()
    Dim Num(1 To 4), I, Nombre, Tirage, Temp ' la taille du tableau correspond au choix des chiffres
    For I = 1 To 4 ' on crée le tableau avec les chiffres
        Num(I) = I
    Next I
    For I = 0 To 2 ' nombre de 3 chiffres
        Tirage = Int(Rnd * (UBound(Num) - I)) + 1 ' tirage au sort sur les index du tableau
        Nombre = Nombre & Num(Tirage)
        Temp = Num(Tirage)
        Num(Tirage) = Num(UBound(Num) - I)
        Num(UBound(Num) - I) = Temp
    Next I
    aleatoire = Nombre
End Function
Sub test()
    For I = 1 To 10
        MsgBox aleatoire
    Next I
End Sub

La sub Test permet de faire 10 demande pour vérifier le fonctionnement...
Le principe : on met en tableau les chiffres voulus, puis on fait un tirage de l'index de ce tableau, ici de 1 à 4.
Le chiffre trouvé, on le place en dernière position, et la dernière position on le met à la place de celui tiré au sort.
Lors de la deuxième boucle on tir au hasard sur trois index du tableau tant est si bien que le chiffre déjà utilisé qui se trouve en dernière position ne sera pas utilisé.
Le deuxième tiré au sort on le met en position 3 et la valeur de la position 3 on le met à l'index tiré au sort, et à la boucle suivante on tire au sort sur deux index...Etc

Il fait ce qui est demandé et il est compréhensible pour faire l'identique avec des chiffres allant de 1 à 9

Après il y a certainement plus optimisé, comme par exemple mettre en tableau toutes les combinaisons puis de tirer au hasard dans ce tableau.

@ bientôt

LouReeD

au top ! merci pour les explications

Et ça marche parfaitement :)

Merci beaucoup

Seb

Bonsoir Sebvosl, LouReeD,

Un autre principe. On exclut un chiffre d'un quatuor. Puis on mélange les 3 autres.

Sub Trios()
Dim Jeu(3)
'Demande d'un nombre de tirages puis RAZ zone d'affichage des Trios
X = InputBox("Nombre de Trios?")
Range("A1:A" & X).Clear
'Boucle de tirages
For N = 1 To X
Uno = WorksheetFunction.RandBetween(1, 4)
'Exclusion d'un chiffre sur 4
Quattro = "1234"
Trio = Replace(Quattro, Uno, "")
'Puis on mélange les 3 autres
For T = 3 To 1 Step -1
Uno = WorksheetFunction.RandBetween(1, T)
Jeu(T) = Mid(Trio, Uno, 1)
Trio = Replace(Trio, Jeu(T), "")
Next T
'Affichage en ligne
Range("A" & N) = Jeu(1) & Jeu(2) & Jeu(3)
Next N
'Partie suppression des doublons de Trios (si besoin)
ActiveSheet.Range("$A$1:$A$" & X).RemoveDuplicates Columns:=1, Header:=xlNo
End Sub

Il existe 24 combinaisons ci-dessous avec les contraintes de la demande.

123213312412
124214314413
132231321421
134234324423
142241341431
143243342432

En moyenne avec 100 tirages et par élimination des doublons générés on ressort (avec tri croissant) l'ensemble des combinaisons.

Nickel, ca fonctionne parfaitement !

Merci

bonjour Sebvosl, LouReeD, X Cellus, le fil,

un truc assez simple, comparable à LouReed

Sub Alea()
     arr = Array(1, 2, 3, 4)     'les 4 chiffres
     For i = UBound(arr) To 1 Step -1     '3 boucles
          r = WorksheetFunction.RandBetween(0, i)     'chiffre aleatoire entre 0 et i
          s = s & arr(r)
          arr(r) = arr(i)
     Next
     MsgBox s
End Sub

Bonsoir,

je comprends bien que c'est le même principe, mais c'est tellement plus simple à la lecture ! Comme toujours BsAlv Simple clair et concis !

@ bientôt

LouReeD

Rechercher des sujets similaires à "macro nombre aleatoire chiffres contraintes"