générateur de nombres aléatoires

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].
 

soufiane1.0

XLDnaute Nouveau
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:confused:
 
Dernière édition:

jeanpierre

Nous a quitté
Repose en paix
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
 

Staple1600

XLDnaute Barbatruc
Re : générateur de nombres aléatoires

Bonsoir soufiane, jeanpierre



Soufiane
Tu sais qu'il existe un générateur de nombres aléatoires intégré à Excel ?

alea.png
 

ROGER2327

XLDnaute Barbatruc
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
 

soufiane1.0

XLDnaute Nouveau
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..
 

ROGER2327

XLDnaute Barbatruc
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:

soufiane1.0

XLDnaute Nouveau
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à.
 

ROGER2327

XLDnaute Barbatruc
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:

soufiane1.0

XLDnaute Nouveau
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?
 

ROGER2327

XLDnaute Barbatruc
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
 

Discussions similaires

Statistiques des forums

Discussions
312 373
Messages
2 087 721
Membres
103 654
dernier inscrit
kingdz2022