Bonsoir.
La difficulté concerne je pense seulement les 3 premiers points. Voici une procédure qui réalise un tirage avec les conditions 1 à 3, et pour une liste de n critères, n étant variable .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| Sub subAlea(ByRef sngTab As Variant)
'réalise un tirage entre 0 et 1 pour chaque élément de sngTab qui doit être un tableau 1 dimension
'le total des valeurs tirée est ramené à 1
'les valeurs sont triées de la plus grande à la plus petite
Dim sngTot As Single
Dim sngMax As Single
Dim i As Integer, j As Integer, jMax As Integer
'tirage des valeurs brutes, chacune entre 0 et 1
Randomize
For i = LBound(sngTab, 1) To UBound(sngTab, 1)
sngTab(i) = Rnd
sngTot = sngTot + sngTab(i)
Next i
'ramener la somme à 1
For i = LBound(sngTab, 1) To UBound(sngTab, 1)
sngTab(i) = sngTab(i) / sngTot
Next i
'trier
For i = LBound(sngTab, 1) To UBound(sngTab, 1) - 1
sngMax = 0
For j = i To UBound(sngTab, 1)
If sngMax < sngTab(j) Then
sngMax = sngTab(j)
jMax = j
End If
Next j
sngTab(jMax) = sngTab(i)
sngTab(i) = sngMax
Next i
End Sub |
L'argument de la procédure est une liste de dimension variable. Le premier index peut être O, 1 ou ce que tu veux. On affecte chaque index à un critère dans l'ordre d'importance des critères.
Pour réaliser un tirage, tu peux par exemple faire :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Sub test()
Dim sng(1 To 8) As Single
Dim s As String
Dim i As Integer
Call subAlea(sng)
s = sng(1)
For i = 2 To 8
s = s & ";" & sng(i)
Next i
Debug.Print s
End Sub |
J'ai obtenu :
0,1733588;0,146215;0,1320548;0,1298985;0,1152831;0,1142225;0,1111151;7,785229E-02
Il te reste à réaliser le code qui appelle 1000 tirages et réalise les stats.
Cordialement,
PGZ
Partager