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.
 

ROGER2327

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

Bonjour Magic_Doctor.



Comme ceci, peut-être ?​
VB:
Sub aleatoire()

Dim i As Integer, nb As Integer, a As Double, b As Double, 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

    Randomize
    For i = 1 To nb
        dico(i) = (b - a) * Rnd() + a
    Next
    Application.ScreenUpdating = False 'Pas vraiment utile...
    [A2].Resize(dico.Count, 1) = Application.Transpose(dico.items)
    Application.ScreenUpdating = True
End Sub



ROGER2327
#6608


Mercredi 11 Palotin 140 (Explosion du Palotin - Vacuation)
11 Floréal An CCXXI, 4,1702h - rhubarbe
2013-W18-2T10:00:31Z
 

Magic_Doctor

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

Bonjour Roger2327,

En effet, je m'étais planté dans la déclaration des variables a et b.
Ça a l'air de marcher très bien.

Merci et bonne journée.
 
Dernière édition:

pierrejean

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

Bonjour Magic_Doctor

Teste ceci

Code:
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 = -100  'limite inférieur multipliée
b = 175  'limite supérieure multipliée par 100 pour avoir un entier
For i = 1 To nb
   Randomize
   x = (Int(b - a) * Rnd() + a) / 100
   dico(x) = x
Next
[A2].Resize(dico.Count, 1) = Application.Transpose(dico.items)
Application.ScreenUpdating = True
End Sub

Arf !!
J'ai encore perdu l'occasion de m'abstenir !!!
Salut ROGER
 
Dernière édition:

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. En effet, j'ai voulu utiliser la macro de ROGER afin de dresser, dans une même feuille, 2 listes de nombres aléatoires. Or, je m'aperçois qu'apparaissent dans chaque liste des doublons, voir des "triplons" (flagrant quand on choisit des nombres entiers). Je trouve ça curieux, car les listes sont issues d'un dictionnaire et que normalement (en tout cas si j'ai bien compris) celui-ci ne génère pas de doublons. Comment y remédier ?

Merci pour toute réponse.
 

Pièces jointes

  • Listes Nb Aléatoires.xlsm
    49.6 KB · Affichages: 48
  • Listes Nb Aléatoires.xlsm
    49.6 KB · Affichages: 46

ROGER2327

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

Bonjour Magic_Doctor.


Extrait de l'aide fournie par Microsoft :​
Dictionary, objet

Description
Objet qui stocke des paires clé/élément de données.​

Syntaxe
Scripting.Dictionary​

Remarques
Un objet Dictionary est l'équivalent d'un tableau associatif PERL. Les éléments, pouvant correspondre à n'importe quelle forme de données, sont stockés dans le tableau. Chaque élément est associé à une clé qui lui est propre. La clé est utilisée pour extraire un élément individuel et correspond généralement à un nombre entier ou à une chaîne, mais peut être n'importe quelle information à l'exception d'un tableau.​
Rien là-dedans ne dit que les éléments sont, à l'instar des clefs, des données uniques.

Où est le problème ?​


Bonne journée.


ℝOGER2327
#8003


Mardi 10 Phalle 142 (Sainte Nitouche, orante - fête Suprême Quarte)
3 Fructidor An CCXXIII, 3,1483h - lycoperdon
2015-W34-4T07:33:21Z
 
Dernière édition:

job75

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

Bonjour Magic_Doctor, Roger, le forum,

Dans la macro de 2013 le Dictionary ne sert à rien puisque les Keys portent sur les numéros de lignes, forcément tous différents !!!

Si l'on veut créer des nombres aléatoires tous différents utiliser :

Code:
Sub Aleatoire(LimInf As Double, LimSup As Double, Plage As Range, Virgule As Byte)
'Dresse une liste de nombres aléatoires
'- LimInf : la plus petite valeur possible de la fourchette de nombres possibles
'- LimSup : la plus grande valeur possible de la fourchette de nombres possibles
'- Plage : plage où apparaissent les nombres aléatoires
'- Virgule : si = 0 --> nombres entiers
'            si > 0 --> détermine alors le nombre de décimales après la virgule
'ROGER2327 / Magic_Doctor / job75

  Dim dico As Object, i As Integer, NbLgn As Integer

  Set dico = CreateObject("Scripting.Dictionary")
  NbLgn = HTABLO(Plage, 0) 'nombre de lignes de la plage [Plage]
    
  Randomize
  While dico.Count < NbLgn
    dico(Round((LimSup - LimInf) * Rnd() + LimInf, Virgule)) = ""
  Wend
  Plage = Application.Transpose(dico.keys)
End Sub
Edit : NbLgn = Plage.Rows.Count serait plus simple non ???

Bonne journée.
 
Dernière édition:

Magic_Doctor

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

Bonjour Roger, job,

Merci pour vos réponses.
Il faut que je me ressource, depuis que j'ai déconnecté...
job, en effet tu as raison : NbLgn = Plage.Rows.Count est nettement plus laconique.

Encore merci et bonne journée à tous.

Je glisse la feuille pour les curieux.

Mais pourquoi diable quand j'écris "0" (zéro) dans n'importe quelle cellule de la feuille, il ne s'affiche pas, bien qu'il soit présent ?
 

Pièces jointes

  • Listes Nb Aléatoires.xlsm
    46.6 KB · Affichages: 48
  • Listes Nb Aléatoires.xlsm
    46.6 KB · Affichages: 47

MJ13

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

Bonjour à tous

Pour afficher les zéros, il faut aller dans les options avancées ou lancer cette macro.

Code:
ActiveWindow.DisplayZeros = True
 

Magic_Doctor

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

Bonjour MJ13,

Merci pour votre réponse. Problème réglé, ou plutôt compris.
BOISGONTIER avait mis ActiveWindow.DisplayZeros = False en raison des formules matricielles. En effet, quand celles-ci sont vides apparaît alors "0". Pas beau !
Donc il faut choisir. On ne peut pas avoir le beurre plus l'argent du beurre...
Je choisirai le nombre de décimales au moyen d'un ComboBox. Ça règlera définitivement le problème du "0" invisible.

Bonne soirée.
 

Magic_Doctor

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

Bonjour,

Lors d'essais, je me suis vite rendu compte que, lorsque les nombres sont décimaux, au-delà de 6 décimales après la virgule, les chiffres qui apparaissent sont toujours "0" (zéro).
Est-ce une limitation d'Excel (j'en doute) ou bien un problème (de variable je suppose) dans la macro ?
Comment y remédier ?

Merci pour toute aide.
 

Pièces jointes

  • Limite Listes Nb Aléatoires.xlsm
    56 KB · Affichages: 39
  • Limite Listes Nb Aléatoires.xlsm
    56 KB · Affichages: 46

job75

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

Bonsoir Magic_Doctor,

C'est lié au fait que la fonction VBA Rnd ne renvoie [Edit : au maximum] que 7 décimales.

Alors que la fonction Excel ALEA() - RAND() in English - en renvoie 15.

Donc si tu veux plus de 7 décimales remplace Rnd par [RAND()]

L'exécution est moins rapide.

A+
 
Dernière édition:

job75

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

Re,

Bon en fait 7 ou 15 décimales pour les nombres aléatoires cela ne change rien avec une limite inférieure de 100000000.

En effet sur Excel un nombre décimal ne peut pas avoir plus de 15 chiffres significatifs.

A+
 

job75

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

Re,

Mon post #12 sur Rnd est erroné :

Code:
Sub a()
MsgBox Rnd
End Sub
affiche en effet 7 décimales.

Mais :

Code:
Sub b()
MsgBox Application.Round(Rnd, 15)
End Sub
affiche 15 décimales.

Ne retiens donc que la conclusion de mon post #13.

A+
 

Magic_Doctor

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

Bonsoir job,

J'ai substitué Rnd() par [Rand()], rien n'a changé.
Où me suis-je encore planté ?
 

Pièces jointes

  • Limite Listes Nb Aléatoires.xlsm
    58.2 KB · Affichages: 49
  • Limite Listes Nb Aléatoires.xlsm
    58.2 KB · Affichages: 44

Statistiques des forums

Discussions
312 199
Messages
2 086 160
Membres
103 147
dernier inscrit
tubaman