Sortie d'une boucle "Faire... Tant que..."

ROGER2327

XLDnaute Barbatruc
Bonjour à tous.


Pourquoi cette procédure :​
Code:
Sub tata()
Dim n&, p&
  Randomize
  Do: n = 0: p = p + 1: Do While Int(6 * Rnd): n = n + 1: Loop: Loop While n < 84
  [A1].Resize(1, 2).Value = Array(n, p)
End Sub
s'exécute-t-elle rapidement, tandis que celle-ci :​
Code:
Sub tutu()
Dim n&, p&
  Randomize
  Do: n = 0: p = p + 1: Do While Int(6 * Rnd): n = n + 1: Loop: Loop While n < 85
  [A1].Resize(1, 2).Value = Array(n, p)
End Sub
boucle longuement, jusqu'au plantage par dépassement de capacité sur p ?​


Bonne journée.


ℝOGER2327
#7818


Jeudi 26 Pédale 142 (Saint Pâle, mineur - fête Suprême Quarte)
30 Ventôse An CCXXIII, 1,9635h - plantoir
2015-W12-5T04:42:45Z
 

pierrejean

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

Re

Comme l'aurait dit un de mes tontons préférés:
La tata de ROGER me les brise menu menu !!!!
Testée avec des valeurs différentes de 6 on obtient également une limite précise a partir de laquelle Excel plante
avec 4 c'est 54 55
5 93 94
6 84 85
7 93 94
8 116 117
9 124 125
10 150 151

Mais j'ai confiance : ROGER ne va tarder à tout nous dire de cet épais mystere
 

Modeste geedee

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

Bonsour®
Bonjour,
Plus exactement 0=False, toute autre valeur=True
eric

Le mot clé True possède une valeur égale à -1.
Const vbTrue = -1 (&HFFFFFFFF)
Const vbFalse = 0

Lorsque d'autres types de données numériques sont convertis en valeurs de type Boolean, 0 devient False et toutes les autres valeurs deviennent True.

Lorsque des valeurs de type Boolean sont converties en d'autres types de données, False devient 0 et True devient -1.
 

Si...

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

re

Tonton, pourquoi tu tousses ? Peut-être un remède en passant par le diagnostic :
la variable n est effacée dans la mémoire (la pile est remise à jour) puis réinitialisée à la déclaration bien sûr à 0 ?
VB:
Sub tutu()
  Dim p&
  Randomize
  Do: Dim n&: p = p + 1: Do While Int(6 * Rnd): n = n + 1: Loop: Loop While n < 10000
  [A1].Resize(1, 2).Value = Array(n, p)
End Sub
 

ROGER2327

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

Bonjour à tous.


Et mes plus plates excuses pour vous avoir fait suer sang et eau.
Le pire est qu'on n'avance pas beaucoup...

Je ne pense pas que la structure de la procédure soit vraiment la source des soucis. Il n'y a pas d'appel récursif de procédure ni d'imbrication de boucles en cascade : la pile des appels ne doit guère être encombrée !

En fait je crois qu'il faut se rendre à l'évidence : la fonction Rnd n'a qu'un mérite, la rapidité. À part ça, elle est daubée grave. Pour en avoir le cœur net, je l'ai remplacée par la fonction Excel ALEA.ENTRE.BORNES. Plus exactement, je remplace
Code:
Int(6 * Rnd)
par
Code:
WorksheetFunction.RandBetween(0, 5)
Alors, tout rentre dans l'ordre. Avec un léger inconvénient : lenteur monumentale. (Si vous voulez essayer, armez vous d'une grande patience !)

J'ai donc repris la chose autrement sur la base de procédures du genre :​
Code:
Const z& = 6000000

Sub tata1()
Dim n&, p&, x%
Dim m&, d(1 To 1000, 1 To 1)
  On Error Resume Next
  Randomize
  For m = 1 To z 
    n = 0: p = p + 1
    Do: n = n + 1: x = WorksheetFunction.RandBetween(0, 5): Loop While x < 1 Or 2 <= x
    d(n, 1) = d(n, 1) + 1
    If p Mod 10000 = 0 Then DoEvents
  Next
  With [D1]: .Offset(0, 0).Value = 1: .Offset(1, 0).Resize(1000, 1).Value = d: End With
End Sub
Cette procédure répète le tirage d'un aléa de "0" à "5". Elle renvoie le nombre n d'aléas tirés jusqu'à l'obtention de "1". Elle est répétée z fois et fournit une colonne de nombres qui dit combien de fois "1" a été obtenu en une fois, en deux fois, en trois fois, etc.
C'est très-lent, mais les résultats obtenus semblent assez réalistes au regard des résultats prévus par la théorie.
Je dis "semblent" car je n'ai pas procédé à une véritable analyse statistique.

Dans le classeur joint, j'ai laissé les résultats obtenus avec RandBetween dans un onglet et ceux obtenus avec Rnd dans un autre. Pour ces derniers, le paramètre z est fixé à 120.000.000. La comparaison des résultats est éloquente.


Ceci dit, je ne sais toujours pas ce que calcule la fonction Rnd. Si un formateur professionnel, un développeur professionnel, un MVP patenté, ou tout autre professionnel de la profession passe par ici et dépose une explication, je requerrai respectueusement sa canonisation auprès de la Sous-Commission du Grand Extraordinaire de la Commission des Imprévisibles du Collège de 'Pataphysique...​


Bonne journée.


ℝOGER2327
#7819


Samedi 28 Pédale 142 (Dédicace du Tripode - Vacuation)
2 Germinal An CCXXIII, 0,9092h - platane
2015-W12-7T02:10:55Z
 

Pièces jointes

  • Distribution (presque) aléatoire (v2).xlsm
    94.3 KB · Affichages: 23

ROGER2327

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

Suite...


Un essai avec la fonction de Dranreb donne des résultats beaucoup plus rapidement que la fonction ALEA.ENTRE.BORNES. Reste à savoir si ces résultats sont corrects : à première vue, un simple contrôle sur la moyenne va dans ce sens. À creuser, donc...


ℝOGER2327
#7820


Samedi 28 Pédale 142 (Dédicace du Tripode - Vacuation)
2 Germinal An CCXXIII, 1,8619h - platane
2015-W12-7T04:28:07Z
 

Staple1600

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

Bonsoir à tous

Ceci dit, je ne sais toujours pas ce que calcule la fonction Rnd. Si un formateur professionnel, un développeur professionnel, un MVP patenté, ou tout autre professionnel de la profession passe par ici et dépose une explication, je requerrai respectueusement sa canonisation auprès de la Sous-Commission du Grand Extraordinaire de la Commission des Imprévisibles du Collège de 'Pataphysique...​
Je ne suis rien de ce qui est dans la liste ci-dessus mais souvent
je vais glaner les nuits sans les lunes quelque manne "excelienne"
En espérant que cela vous apporte les explications recherchées.
 

pierrejean

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

Bonjour à tous

Coté clarté : un peu mieux grâce à JM
Coté efficacité : un peu mieux grâce à Laeticia (bises si elle le permet)

Il n'en reste pas moins que je ne peux toujours pas accorder ce que l'on sait des probabilités (Merci Gérard) et des résultats des macros

Dans le fichier joint : de quoi s'amuser un zeste
 

Pièces jointes

  • Randomize.xlsm
    33 KB · Affichages: 23
  • Randomize.xlsm
    33 KB · Affichages: 29
  • Randomize.xlsm
    33 KB · Affichages: 28

Modeste geedee

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

Bonsour®
Il n'en reste pas moins que je ne peux toujours pas accorder ce que l'on sait des probabilités (Merci Gérard) et des résultats des macros
J'en conclut que cette suite est limitée et que la tata de ROGER en cherchant une suite de 85 chiffres differents de 0 épuise ladite suite sans qu'Excel ne l'ait prévu

La macro test ci incluse montre que cette suite aurait au moins 1 000 000 000 de nb aleatoires

comme précisé là :
https://support.microsoft.com/fr-fr/kb/828795
La combinaison de nombres telle qu'elle est effectuée dans la procédure Wichman-Hill garantit que plus 10^13 nombres vont être générés avant le début de la répétition

tétra-capillectomie ???
;) :D :cool:
 

pierrejean

XLDnaute Barbatruc
Re : Sortie d'une boucle "Faire... Tant que..."

Hello Modeste

J'ai bien vu mais je crois qu'aucune boucle ( même inactive ) ne supporterait 10^13
Je me suis arrête à 2*10^9 (qui prend chez moi 23 secondes pour ne rien faire)
A 10^9 la macro du fichier demande environ 4 minutes pour s'achever
Quant à la capillectomie il y a beau temps qu'elle devenue impossible !!!
 

Discussions similaires

Réponses
8
Affichages
665
Réponses
12
Affichages
1 K

Statistiques des forums

Discussions
312 249
Messages
2 086 601
Membres
103 258
dernier inscrit
kalis03