XL 2013 Nombre aléatoire

mwehu

XLDnaute Nouveau
Bonsoir, j'aimerais avoir 1 nombre aléatoires dans 4 cellules dont la somme des cellules doit être égal à une somme connu déjà bien avant: qu'elle est la formule excel qu'il faut ??? Merci beaucoup de m'aider
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
En A1 : le total souhaité,
En B1 :
Code:
=ALEA()*$A$1
En B2 :
Code:
=ALEA()*($A$1-B$1)
En B3 :
Code:
=ALEA()*($A$1-SOMME(B$1:B$2))
En B4 :
Code:
=$A$1-SOMME(B$1:B$3)
Pour des entiers vous pouvez remplacer dans toutes les formules "()*(" par ".ENTRE.BORNES(0;"
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour mwehu, le forum,

Je suppose qu'il faut travailler avec des nombres entiers positifs.

Alors voyez le fichier joint et cette macro :
VB:
Sub Tirages()
Dim s, a(1 To 4), i, n
s = Int(Val([A1]))
If s < UBound(a) Then [B1:B4].ClearContents: Exit Sub
Randomize
Do
    For i = 1 To 4: a(i) = 1 + Int(s * Rnd): Next
    n = n + 1
Loop While Application.Sum(a) <> s
[B1:B4] = Application.Transpose(a)
MsgBox Format(n, "#,##0") & " itérations"
End Sub
A+
 

Pièces jointes

  • Tirages.xlsm
    16.7 KB · Affichages: 11

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous
perso je prends 3 nombres compris entre 1 et le (max demandé/4) et le 4eme c'est le reste
je n'ai pas besoins de do/loop pour tester si la somme est bonne
et finalement le 4eme est un nombre au hasard puisqu'il est la conséquence des 3 premiers nombre aléatoire
VB:
Option Explicit

Sub Tirages()
    Dim s, a(1 To 4), i
    s = Int(Val([A1]))
    [B1:B4].ClearContents
    Randomize
    For i = 1 To 3: a(i) = 1 + Int(Rnd * (s / 4)): Next
    a(4) = s - Application.Sum(a)
    [B1:B4] = Application.Transpose(a)
End Sub
 

job75

XLDnaute Barbatruc
Cela dit la boucle Do/Loop n'est pas une bonne solution si le nombre en A1 est très grand.

Elle peut prendre beaucoup de temps, alors utilisez plutôt :
VB:
Sub Tirage()
Dim s, a(1 To 4)
s = Int(Val([A1]))
If s < UBound(a) Then [B1:B4].ClearContents: Exit Sub
Randomize
a(1) = 1 + Int(Rnd * (s - 3))
a(2) = 1 + Int(Rnd * (s - a(1) - 2))
a(3) = 1 + Int(Rnd * (s - a(1) - a(2) - 1))
a(4) = s - Application.Sum(a)
Application.ScreenUpdating = False
[B1:B4] = Application.Transpose(a)
[C1:C4] = "=RAND()" 'plage auxiliaire
[B1:C4].Sort [C1], Header:=xlNo 'tri aléatoire
[C1:C4] = ""
End Sub
 

Pièces jointes

  • Tirage.xlsm
    17.3 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
re
bonjour @job75
Les 4 nombres que tu obtiens ne sont pas vraiment aléatoires puisque chacun est limité au quart de la somme.
pareil pour toi
en fait si tu regarde bien les sub resultat en console tu fait la même chose
alors oui je te l'accorde la largeur de possibilité est plus grange pour a(1) et a(2) mais c'est exactement la même chose
VB:
a(1) = 1 + Int(Rnd * (s - 3))
a(2) = 1 + Int(Rnd * (s - a(1) - 2))
a(3) = 1 + Int(Rnd * (s - a(1) - a(2) - 1))
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @job75
ma fois sur 100 000
si a(1) te sort 50000 il te reste quoi ;)
comme je te l'ai dit c'est la même chose sauf que la limite dépend des précédents items de a
si a(1) sort 50 000 il ne reste plus que 50 000 à partager en 3
si a(2) sort 40 000 il ne reste plus que 10 000 a partager dans les deux autres

autrement dit si tu sort un gros chiffre dans les premier items les suivants seront très petits par rapport au premiers
avec ma méthode on fait pareil finalement mais a l'envers puisque si j'ai un total très petit le 4 est forcement bien plus grand
disons que il y a plus de chance de repartir la somme en 4 parts de même tranches

donc quand tu dis
Les 4 nombres que tu obtiens ne sont pas vraiment aléatoires puisque chacun est limité au quart de la somme.
et bien avec ta version
a(1) n'est pas limité sauf avec le -3
a(2) est limité a le max - a(1)
a(3) est limité au max - les deux précédents
a(4) est limité au max - les 3 précédents
on peut donc considérer que ce n'est plus vraiment aléatoire aussi
 

Discussions similaires

Réponses
4
Affichages
198
Réponses
4
Affichages
185

Statistiques des forums

Discussions
313 902
Messages
2 103 391
Membres
108 631
dernier inscrit
tarek.kanaan