Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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 Accro
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
non là ca va plus je vais prendre des mesure
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…