générateur de nombres aléatoires

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

soufiane1.0

XLDnaute Nouveau
bonsoir,
j'aimerai générer des nombres pseudo aléatoire dans une intervalle donner mais sans utiliser la fonction RAND ou RANDOMIZE.
l'idée c'est d'utiliser une suite (Xn=(a Xn-1 + b) mod m) pour la quelle ce base justement la fonction RAND. mais j'arrive pas a utiliser la suite pour générer par exemple 10 nombre aléatoire dans l'intervalle [0,1].
 
Re : générateur de nombres aléatoires

bonsoir Staple1600 ,
ca serai assez facile sinon.
le but c'est de ne pas utiliser ces fonction là et crée un générateur...
j'avoue que c'est une question plus algorithmique que VBA. suffit de trouver le bon algo chose que j'arrive pas😕
 
Dernière édition:
Re : générateur de nombres aléatoires

Bonsoir soufiane1.0, JM,

Je cite :
"le but c'est de ne pas utiliser ces fonction là et crée un générateur..."


Pour créer ton "générateur", il faudra, de toutes façon passer par des fonctions.... Excel ou Vba.

J'ai rien compris et/ou tu précises.

Bonne soirée en attendant.

Jean-Pierre
 
Re : générateur de nombres aléatoires

Bonsoir à tous,
soufiane1.0 aborde un sujet très-intéressant mais très-délicat. L'engendrement d'une suite pseudo-aléatoire par une formule du genre
Xn=(a Xn-1 + b) mod m
est effectivement envisageable et il existe une vaste littérature à ce propos. Le choix des paramètres a, b et m doit être raisonné et ne relève pas des mathématiques élémentaires. Pour les utilisations courantes, genre brassage de liste ou "tirage au sort" d'un item dans une liste courte (quelques centaines ou milliers d'entrées), il est sans doute préférable de s'en remettre aux outils fournis par Microsoft®, même si leur qualité peut être mise en question par la théorie. Sauf à se livrer à une étude ardue, la maîtrise de la voie proposée par soufiane1.0 me semble... ...hasardeuse.​
Pour ma part, je ne me risquerais pas dans cette voie sans avoir des raisons très-sérieuses de le faire. Aussi posé-je la question à soufiane1.0 : pourquoi ne voulez-vous (ou ne pouvez-vous) utiliser les outils fournis par Microsoft® ?​
ROGER2327
 
Re : générateur de nombres aléatoires

bonsoir 🙂
tout d'abord merci pour vos nombreuses et précieuses réponses.
je suis enfin arriver a réaliser le compteur, le seul hic c'est que quand je veux préciser une intervalle ça marche pas. voila mon code

Code:
Sub compteur()
A = 214013
c = 2531011
Z = 2 ^ 24

x = InputBox("nombre d'éléments")
A = InputBox("la borne inf")
b = InputBox("la borne sub")
x0 = 1
For i = 1 To x
  x1 = A * x0 + c Mod Z
  x1 = x1 * (b - A) + A
  MsgBox (x1)
  x0 = x1
Next

End Sub

j'aimerai que les valeurs aléatoire soient dans l'intervalle [a,b] , c'est pourquoi j'ai ajouté la ligne
x1 = x1 * (b - A) + A
mais ca marche pas..
 
Re : générateur de nombres aléatoires

Bonsoir soufiane1.0
Il faut tenir compte de l'ordre des opérations. Si vous utilisez la formule
Xn=(a Xn-1 + b) mod m
votre procédure doit avoir l'allure suivante :
Code:
Sub compteur()
    a= 214013
    b = 2531011
    m = 2 ^ 24
    n = InputBox("nombre d'éléments")
    bInf = InputBox("la borne inf")
    bSup = InputBox("la borne sub")
    x = 1
    For i = 1 To n
      x = (a * x + b) Mod m
      MsgBox (x * (bSup - bInf) / m + bInf)
    Next
End Sub
Vous obtiendrez alors des valeurs dans l'intervalle [ bInf, bSup [ (et non pas [ bInf, bSup ]).
Malheureusement, cette procédure conduit à un dépassement de capacité dû à la fonction Mod.
On peut contourner cela en remplaçant la boucle par :
Code:
    For i = 1 To n
      x = a * x + b
      x = x - Int(x / m) * m
      MsgBox (x * (bSup - bInf) / m + bInf)
    Next
Il reste à prouver que les arrondis qu'entraîne cette solution ne fausse pas le résultat attendu.
Dites-moi ce que vous en pensez.​
ROGER2327
 
Dernière édition:
Re : générateur de nombres aléatoires

re
petite remarque la première ligne du code
Code:
bInf = 214013
ne sert plus a rien puisqu'on demande juste aprés d'entrer la binf.
code :
Code:
Sub compteur()

    b = 2531011
    m = 2 ^ 24
    n = InputBox("nombre d'éléments")
    bInf = InputBox("la borne inf")
    bSup = InputBox("la borne sub")
    x = 1
    For i = 1 To n
      x = (bInf * x + b) Mod m
      resultat = x * (bSup - bInf) / m + bInf
      MsgBox (resultat)
    Next
    
End Sub
pour le reste ça marche super bien.. sauf pour le cas ou la bInf=0. j'y pense encore pour ajouté une condition quelque part pour ce cas là.
 
Re : générateur de nombres aléatoires

Désolé ! J'étais en train de modifier mon dernier message au moment où vous le lisiez.
"b" et "bInf" sont des constantes différentes : vous pouvez modifier "bInf" et "bSup" tant que vous voulez, mais vous devez conserver la valeur 214013 pour "a" et 2531011 pour "b".
 
Dernière édition:
Re : générateur de nombres aléatoires

et ben voilà chapeau😉 ça marche a tout les coups...du beau travail vraiment !
question bonus lol : est ce qu'on pourrai faire évoluer encore le programme pour qu'a chaque fois qu'on le fait marcher nous donne des résultats différentes?
 
Re : générateur de nombres aléatoires

Re-bonsoir soufiane1.0
Pour obtenir des suites différentes, il faut à chaque fois initialiser x avec une valeur différente, i.e. modifier la ligne
Code:
    x = 1
On peut la remplacer par
Code:
    x = InputBox("Initialiser le générateur")
et donner la valeur de son choix (entre 0 et 2^24).​
Voila...
ROGER2327
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour