Générer des nombres aléatoires dont la somme est pré-déterminée....

Peppone13

XLDnaute Occasionnel
Bonsoir le Forum, ou plutôt bonne nuit !!!!

J'ai regardé toutes les discussions tournant autour des nombres aléatoires, mais sans trouver ce que je recherche.:confused:
Je pense que les fonctions ALEA() ou ALEA ENTRE BORNES() devraient convenir, mais je ne trouve pas la petite astuce finale.
Comme vous le verrez dans le fichier joint, je souhaite générer 4 nombres entiers aléatoires compris entre 1 et 19, il peut y avoir des doublons. Jusque là, pas trop de problème.
Là où (pour moi) ça se complique, c'est que le total de ces 4 nombres est connu à l'avance (par exemple 20 ou 25 dans mon petit fichier).

Si quelqu'un à l'étincelle qui me manque !!!:rolleyes:
Un grand merci par avance, et EXCELLENT week-end,:cool:
Peppone.
 

Pièces jointes

  • Master Mind 2.xlsx
    11.5 KB · Affichages: 271
  • Master Mind 2.xlsx
    11.5 KB · Affichages: 258
  • Master Mind 2.xlsx
    11.5 KB · Affichages: 261

Alauda

XLDnaute Nouveau
Re : Générer des nombres aléatoires dont la somme est pré-déterminée....

Bonjour!
N'étant pas très à l'aise avec Excel et la programmation (mais je me soigne), je me permets de poster un problème similaire dans ce post :
Il se trouve que dans une colonne de 6 cases, je souhaiterai distribuer aléatoirement un nombre entre 5 et 20, et dont la somme totale des 6 cases serait obligatoirement 80...
C'est cette somme obligatoire que je n'arrive pas à placer, parce que bon, l'aléatoire, je l'ai trouvé ^^
La solution est probablement dans ce topic, mais j'avoue que je me perds beaucoup dans tout ça, je m'en excuse...
Serait-il possible que vous remettiez tout ça à plat, afin qu'une noob puisse comprendre?
Je vous remercie d'avance !
 

KenDev

XLDnaute Impliqué
Re : Générer des nombres aléatoires dont la somme est pré-déterminée....

Bonjour Alauda,

Une possibilité avec le code suivant. Le résultat apparait en A1-A6 de la feuille active. J'ai commenté le code mais n'hésites pas si question.

Cette approche bête et méchante est possible car les conditions sont raisonables :
Nombre moyen tiré au sort = (5+20)/2 = 12,5
Nombre moyen dans une case = 80/6 = 13,33
Les 2 valeurs sont proches. Avec d'autres conditions il faudrait sans doute une autre approche.

Cordialement

KD

VB:
Sub Test()
    Dim s%, i%, n&, c&
    Const Cs& = 6, Mn& = 5, Mx& = 20, Cb& = 80 'nb de cases, minimum, maximum, cible
    ReDim Tb%(1 To Cs)  'conteneur des cases
    n = Mx - Mn + 1     'nb de nombres autorisés
    Randomize
Line1:
    Do
        c = c + 1       'compteur d'essais (inutile, pr info)
        s = 0           'somme des aléatoires en cours
        For i = 1 To Cs
            Tb(i) = Mn + Int(n * Rnd)   'valeur aléatoire pour ième case
            s = s + Tb(i)               'MJ résultat
            If s + (Cs - i) * Mx < Cb Or s + (Cs - i) * Mn > Cb Then Exit For 'arréter essai en cours si impossibilité (pas super utile sur 6 cases seulement)
        Next i
        If i < Cs + 1 Then GoTo Line1    'si i < 7, c'est que l'essai à été avorté, refaire
    Loop Until s = Cb               'refaire tant que cible non atteinte
    [A1].Resize(Cs) = Application.Transpose(Tb) 'afficher en ligne à partir de A1
    MsgBox "Trouvé en " & c & " essai" & String(-(c > 1), "s") 'info
End Sub
 
Dernière édition:

Alauda

XLDnaute Nouveau
Re : Générer des nombres aléatoires dont la somme est pré-déterminée....

Oooh , génial !

C'est exactement ce qu'il me fallait!
Clair et concis, merci beaucoup !! \o/
(le rafraîchissement par le F9 n'est pas possible, mais je chipote pour pas grand-chose)

J'ai juste du mal avec le "s = 0 'somme des aléatoires en cours", à quoi il sert, exactement? ^^"
Mais ça voudrait donc dire que le code proposé ne marcherait pas forcément avec d'autres chiffres?

Encore merci d'avoir pris le temps de résoudre mon problème !
 

KenDev

XLDnaute Impliqué
Re : Générer des nombres aléatoires dont la somme est pré-déterminée....

Re,

Le code passe à chaque essai par la ligne Do, s stocke la somme des nombres tirés au sort. Si on ne mettait pas s=0, s vaudrait au premier passage 0 (valeur par défaut) puis, par exemple, 83, 168, 253, etc... Comme le but est s=80, on prendrai le risque d'attendre longtemps...

Le code peut marcher avec d'autre chiffres bien sûr. On peut s'amuser à faire varier tous les nombres de la ligne 'Const Cs& = 6, Mn& = 5, Mx& = 20, Cb& = 80' et observer le nombre d'essais annoncé.

Attention il faut corriger cette ligne 'If i < 7' qui devient 'If i < Cs + 1' (7 n'était valable que pour Cs=6 bien sur)

Simplement si l'on choisit des cas plus difficiles la sub peut tourner beaucoup plus longtemps voire indéfiniment.

Pour le cas proposé la sub réalise environ 29 essais avant d'arriver au résultat (1 000 000 de tests). Avec
Cs& = 5, Mn& = 12, Mx& = 30, Cb& = 100, j'obtiens c=31 (1 000 000 de tests)
Cs& = 17, Mn& = 47, Mx& = 821, Cb& = 7000, j'obtiens c=2296 (1 000 tests)
Cs& = 10, Mn& = 1, Mx& = 10, Cb& = 80, j'obtiens c=886 (10 000 tests)

Cordialement

KD

Edit :
- Pour le confort d'un F9 pourquoi ne pas associer la sub à un bouton ou lui attribuer un raccourci clavier ?
- Code corrigé dans le post précédent
 
Dernière édition:

Plessier

XLDnaute Nouveau
Bonjour,

J'ai parcouru les discussions concernant la recherche des nombre dont la somme est connu.
Je voudrais savoir si on pouvait faire de même avec 5 nombres a déterminer au lieux de 4, dont la somme est connu, et les nombre a déterminer sont compris en 1 et 40.
Exemple la somme est 120= (x1+x2+x3+x4+x5). et x1 a x5 sont des entiers compris entre 1 et 40 avec aucun doublons par possibilité.
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Bonjour,

J'ai parcouru les discussions concernant la recherche des nombre dont la somme est connu.
Je voudrais savoir si on pouvait faire de même avec 5 nombres a déterminer au lieux de 4, dont la somme est connu, et les nombre a déterminer sont compris en 1 et 40.
Exemple la somme est 120= (x1+x2+x3+x4+x5). et x1 a x5 sont des entiers compris entre 1 et 40 avec aucun doublons par possibilité.
:rolleyes: comme ceci ???
sans macro :cool:
F9 pour un autre tirage
upload_2017-7-19_0-38-0.png
 

Pièces jointes

  • 5 parmi 1_40 somme 120.xlsx
    16.5 KB · Affichages: 29

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour Plessier, Modeste geedee,

Une version v2 qui tente d'améliorer la vitesse d' exécution quand la somme cible est soit très proche de la somme minimale possible, soit très proche de la somme maximale possible.
 

Pièces jointes

  • Plessier- Tirage à somme définie- v2.xlsm
    23.1 KB · Affichages: 32
Dernière édition:

Statistiques des forums

Discussions
314 633
Messages
2 111 409
Membres
111 126
dernier inscrit
vitam