Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Je voudrais dresser une liste de nombres réels aléatoires.
Pour ce faire, plutôt que de passer par une boucle interminable qui rempli, au fur et à mesure, chaque ligne d'un tableau de la feuille, j'ai préféré utiliser le dictionnaire : bien plus rapide et pas de doublons. J'ai cherché un algorithme pour les nombres aléatoires, mais j'avoue que celui que j'ai trouvé ne marche pas très fort car les nombres renvoyés dépassent largement les limites fixées :
VB:
Sub aleatoire()

Application.ScreenUpdating = False
Dim i As Integer, nb As Integer, a As Integer, b As Integer, dico As Object
Set dico = CreateObject("Scripting.Dictionary")
nb = 10  'nombre de lignes du tableau
a = -1  'limite inférieur
b = 1.75  'limite supérieure

For i = 1 To nb
    'Randomize 'faut-il ou pas le mettre ???
    dico(i) = Int(b - a + 1) * Rnd() + a 'bidouillage algorithmique
Next
[A2].Resize(dico.Count, 1) = Application.Transpose(dico.items)
Application.ScreenUpdating = True
End Sub

Merci d'avance pour toute aide.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Re,

Je reteste :

virgule = 0 --> nombres entiers
Supposons l'intervalle [1 , 10] : commence à 1 et fini à 10
intervalle ]1 , 10[ : 1 et 10 exclus --> commence à 2 et fini à 9

virgule = 1 --> nombres décimaux (un seul chiffre après la virgule)
Intervalle ]1 , 10[ : 1 et 10 exclus --> commence à 1,1 et fini à 9,9

virgule = 2 --> nombres décimaux (2 chiffres après la virgule)
Intervalle ]1 , 10[ : 1 et 10 exclus --> commence à 1,01 et fini à 9,99
 

Magic_Doctor

XLDnaute Barbatruc
Re : Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Bonjour,

Je reviens sur ce fil.
Les listes de nombres aléatoires sont bien dressée grâce à la macro "Aleatoire" de job. Cependant, lors d'essais, je me heurte au problème suivant.
Prenons, par exemple, l'intervalle [1 , 100]. On travaillera sur des valeurs entières (Nb Déc = 0).
Entre 1 et 100 inclus il y a 100 nombres entiers.
Dans la cellule correspondant au "Nombre de lignes désirées" (la seule dans la feuille où l'on peut rentrer quelque chose) je choisis 100, puisqu'il ne peut y avoir davantage de nombres entiers entre ces deux valeurs. Je clique sur "GO" --> tout s'efface.
Maintenant je choisis comme nombre de lignes (pour le même intervalle) 99. Je clique sur "GO" --> ça marche, mais manque la limite supérieure, en l'occurence 100.
J'ai l'impression que l'algorithme omet systématiquement la limite supérieure de l'intervalle.
Si c'est le cas, comment y remédier ?

Merci d'avance pour tout conseil.

Bonne journée.
 

Pièces jointes

  • Listes nombres aléatoires.xlsm
    140.1 KB · Affichages: 24

job75

XLDnaute Barbatruc
Re : Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Bonjour Magic_Doctor,

Avec les entiers, si tu veux atteindre la borne supérieure, modifie ces 2 lignes de la macro Aleatoire :

If 1 + (LimSup - LimInf) * 10 ^ virgule < NbLgn Then End

X = Round((LimSup - LimInf) * Rnd + LimInf)

A+
 

Modeste geedee

XLDnaute Barbatruc
Re : Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Bonsour®
Je clique sur "GO" --> ça marche, mais manque la limite supérieure, en l'occurence 100.
J'ai l'impression que l'algorithme omet systématiquement la limite supérieure de l'intervalle.

:rolleyes:
si l'algorithme utilise la fonction ALEA() ou RND()
par construction ("byDesign" ;) )celle-ci renvoie un nombre réel aléatoire distribué de manière symétrique supérieur ou égal à borne inferieure(0) et inférieur à borne supérieure(1)
toute variante sera soumise à schéma... :(
i.e
[0 , 1[ ou [BorneInf, BorneSup[

pour un comportement différent, il faut envisager un autre générateur...
 

Magic_Doctor

XLDnaute Barbatruc
Re : Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Bonjour Modeste geedee,

Je ne connaissais pas cette subtilité.
Bon, à défaut de modifier l'algorithme de job (ce dont je suis tout à fait incapable...), j'ai réglé le problème à la hussarde.
Pour appeler la macro de job, plutôt qu'écrire :
VB:
Call Aleatoire(Lim_Inf, Crochet1, Lim_Sup, Crochet2, virg, Range("Colonne1))
puisque les bornes ne peuvent être qu'ENTIÈRES, je contourne le problème en écrivant :
VB:
Call Aleatoire(Lim_Inf, Crochet1, Lim_Sup + 1, Crochet2, virg, Range("Colonne1))
Et je récupère ainsi l'intégralité des nombres compris dans l'intervalle.
 

job75

XLDnaute Barbatruc
Re : Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Re, salut Modeste geedee,

Mon post #34 n'est valable que pour les nombres entiers, c'est à dire virgule = 0.

Utilise donc plutôt :

If (LimSup - LimInf) * 10 ^ virgule - (virgule = 0) < NbLgn Then End

X = Int((LimSup - (virgule = 0) - LimInf) * Rnd + LimInf)

Avec virgule > 0 la limite supérieure (nombre entier) n'est jamais atteinte puisqu'il y a toujours des décimales dans les nombres créés.

Petit rappel : l'expression virgule = 0 renvoie True converti en -1 quand elle est vraie...

A+
 

job75

XLDnaute Barbatruc
Re : Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Re,

Maintenant pour régler ton affaire de crochets utilise dans la macro Aleatoire :

Code:
Dim ajout1 As Boolean, ajout2 As Boolean
'----
ajout1 = Crochet1 = "]" And virgule = 0
ajout2 = Crochet2 = "]" And virgule = 0
If (LimSup - LimInf) * 10 ^ virgule + ajout1 - ajout2 < NbLgn Then End
'----
X = Int((LimSup - LimInf + ajout1 - ajout2) * Rnd + LimInf - ajout1)
Tu peux appeler cette macro avec les crochets que tu veux.

Bien sûr avec virgule > 0 les deux limites ne sont jamais atteintes.

A+
 

Magic_Doctor

XLDnaute Barbatruc
Re : Générer une liste de nombres réels aléatoires au moyen d'un dictionnaire

Bonsoir job, le forum,

Je viens d'essayer, ça marche bien. Il me reste encore à régler le problème du choix automatique des crochets à partir de l'USF qui, cela dit en passant, m'aura bien fait suer !
J'ai, d'autre part, corrigé quelques détails pour éviter quelques plantades. Ça commence à enfin bien marcher...

Buenas noches
 

Pièces jointes

  • Listes nombres aléatoires (2).xlsm
    140.5 KB · Affichages: 26

Statistiques des forums

Discussions
312 353
Messages
2 087 543
Membres
103 584
dernier inscrit
Serka