XL 2013 crer une liste de nombres aleatoires entre un min et un max avec une fonction VBA méthode particulière

patricktoulon

XLDnaute Barbatruc
Bonsoir à tous
c'est juste pour le fun
perso pour créer une liste de nombres aléatoires je préfère mélanger une liste ordonné(dans l'ordre au départ)
on a la garantie de non doublons et c'est largement plus rapide
sauf que là l'exercice est encore plus intéressant
je demarre avec une liste (un array vide(sans valeur)
alors pour faire de 1 à max ca va ,mais pour faire de min à max ca devient compliqué avec cette méthode tout du moins sans transformé un code très simple à la base en en centrale nucléaire

voici la méthode avec un array vide sans doublons et de 1 à max
VB:
Function randomListNumber(maxi)
   Dim i&, X&, temp
   Randomize
    ReDim t(1 To maxi)
    For i = 1 To maxi
        If t(i) = "" Then t(i) = i
        temp = t(i)
        X = 1 + Int((Rnd * (maxi - 1)))
        If t(X) = "" Then t(X) = X
        t(i) = t(X)
        t(X) = temp
    Next
    randomListNumber = t
End Function

Sub test()
    MsgBox Join(randomListNumber(30), vbCrLf)
End Sub
 

patricktoulon

XLDnaute Barbatruc
Y aurait-il une autre façon de faire ?
Sûrement ! A vous de jouer.
Mais cette méthode est très subtile et efficace car elle utilise à la fois l'indice et le Rnd pour valoriser 2 valeurs en 1 passage.
et elle est surtout très rapide car nul besoins de surveiller les doublons
autrement dit même si un item peut être interverti avec un [autre(pas forcement le même)] mais il n'y aura jamais de doublons
 

laurent950

XLDnaute Barbatruc
Re @patricktoulon

je fais un autre essaie

VB:
Function randomListNumber3(mini, maxi, nb) As String()
    Dim i As Long, result() As String
    ReDim result(1 To nb)
    Randomize
    For i = 1 To nb
        result(i) = CStr(Int((maxi - mini + 1) * Rnd) + mini)
    Next
    randomListNumber3 = result
End Function

Sub test()
    MsgBox Join(randomListNumber3(-3, 20, 10), vbCrLf)
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re
Sinon, on peut rester sur un tableau usuel de 1 à n et translater simplement à la fin :
VB:
Function AleaMinMaxUsineAgaz(mini, maxi)
Dim n&, i&, k&, aux&
   n = maxi - mini + 1: ReDim t(1 To n)
   Randomize
   For i = 1 To n: t(i) = i: Next
   For i = 1 To n: k = 1 + Int(Rnd * n): aux = t(i): t(i) = t(k): t(k) = aux: Next
   For i = 1 To n: t(i) = mini - 1 + t(i): Next
   AleaMinMaxUsineAgaz = t
End Function
 

patricktoulon

XLDnaute Barbatruc
re
la version de mapomme avec les 3 argument
VB:
Function randomListNumber(mini, maxi, nb)
Dim i&, n&, k&, aux, t()
   ReDim Preserve t(mini To maxi): n = maxi - mini + 1
   Randomize
   For i = mini To maxi: t(i) = i: Next
   For i = mini To maxi: k = mini + Int(Rnd * n): aux = t(i): t(i) = t(k): t(k) = aux: Next
   ReDim Preserve t(mini To mini + nb)
   randomListNumber = t
End Function

Code:
Sub test()
MsgBox Join(randomListNumber(-10, 20, 12), vbCrLf)
End Sub
 

patricktoulon

XLDnaute Barbatruc
Re
Sinon, on peut rester sur un tableau usuel de 1 à n et translater simplement à la fin :
VB:
Function AleaMinMaxUsineAgaz(mini, maxi)
Dim n&, i&, k&, aux&
   n = maxi - mini + 1: ReDim t(1 To n)
   Randomize
   For i = 1 To n: t(i) = i: Next
   For i = 1 To n: k = 1 + Int(Rnd * n): aux = t(i): t(i) = t(k): t(k) = aux: Next
   For i = 1 To n: t(i) = mini - 1 + t(i): Next
   AleaMinMaxUsineAgaz = t
End Function
non là ca va plus je vais prendre des mesure
diabolo.gif
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 125
Membres
112 666
dernier inscrit
Coco0505