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
 

eriiic

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

Bonjour,

Pour moi les 2 plantent pareil (testé sur 2003).
Sur n si on a une longue série avec Rnd<>0 (pas obtenue), ou sur p si on en a pas.
En déclarant les variables en entier on l'obtient plus souvent.
A part que tu laisses une chance de plus pour planter avec la 2nde version je ne vois pas de différence.

eric
 

Si...

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

salut

je ne pense pas que cela vienne exclusivement du type de déclaration de p.
Plus la limite supérieure de n est grande plus il y a risque de relances de la première boucle et on peut arriver à saturation de la pile.

voir l'aide :
--------------
Espace pile insuffisant (erreur 28)

...
La pile est une zone de travail de mémoire dont la taille varie dynamiquement en fonction des demandes du programme exécuté. Causes et solutions de cette erreur*...
---------------

Avec mon 2010, la récursivité, notamment lors d'évènementielles, ne retourne même pas le message d'erreur et me laisse sans possibilité de bloquer le plantage ! Par contre, il m'en propose bien un quand le type de déclaration de variable ne convient pas !

Remarque, dans ton affichage ([A1].Resize(1, 2).Value = Array(n, p)) n sera toujours ta limite supérieure.
 

Paf

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

Bonjour à tous

a priori:
la probabilité d' avoir un chiffre différent de "0" , 84 fois de suite n'est pas bien grande;pour 85 fois de suite elle diminue encore; donc le nombre d'essais augmente ce qui explique l'augmentation du temps de traitement et le dépassement de capacité .

A+
 

pierrejean

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

Bonjour ROGER , bonjour eriiiic
Chez moi (Excel 2010) les macros se conduisent bien comme le décrit ROGER
A mon humble avis c'est parce qu'il y a beaucoup plus de chance d'avoir 84 tirages Int(6 * Rnd) successifs sans 0 que 85
Mais mes connaissances en statistiques sont insuffisantes pour l'expliciter

Edit: Salut Paf (avais pas actualisé ! )
 

JBARBE

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

Bonjour à tous,

Avec Excel 2007 avec 84 et inférieur tout va bien ! Par contre avec 85, il n'y a pas de plantage puisque j'ai dû arrêté la macro au bout de 10 mn !

Même au-delà de 85 le calcul est interminable !

bonne journée !
 
Dernière édition:

job75

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

Bonjour à tous,

Si chaque nombre de 0 à 5 a bien une probabilité de 1/6 d'être tiré :

- la probabilité d'avoir 84 tirages sans 0 est (5/6)^84 = 2,23242E-07 soit en moyenne un tirage sur 4 479 450

- la probabilité d'avoir 85 tirages sans 0 est (5/6)^85 = 1,86035E-07 soit en moyenne un tirage sur 5 375 340.

Ce ne sont pas des probabilités très différentes, et il est en effet étonnant que la 2ème macro plante.

C'est bien pour ça que Roger a ouvert ce fil.

Perso j'en conclus qu'avec 85 tirages consécutifs la probabilité de survenance du 0 est bien supérieure à 1/6 !!!

Roger nous fait donc découvrir ici une anomalie de la fonction Rnd.

A+
 

job75

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

Re,

Peut-être que l'"anomalie" de Rnd tient au fait que cette fonction renvoie un nombre avec au maximum 7 décimales.

Chaque nombre a donc une probabilité 1E-07 de survenir.

Du même ordre que les probabilités calculées précédemment...

A+
 

Dranreb

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

Bonjour.

On peut effectivement se demander pourquoi Rnd renvoie un Single…
En tout cas cette fonction perso m'a donnée meilleure satisfaction que Rnd pour la création d'une image d'un ciel étoilé. Mais il n'y a pas de raison non plus de la présumer irréprochable.
VB:
Function Aléat(Optional ByVal G As Double = -1) As Double
Static X As Double
If G >= 0 Then If G > 0 Then X = G Else X = Now / 2958466
X = (X + 1.35198775424545) ^ 7: X = X - Int(X)
Aléat = X
End Function
 

camarchepas

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

Bonjour à tous ,

Effectivement ça plante au bout d'un long moment

j'ai modifié un peu le code pour pouvoir tracer les résultats.

Bon , j'ai aussi ajouté un Doevents pour laisser respirer l'ordi et entre autre gérer la pile .

J'ai l'impression que la fréquence cyclique du zéro est justement de 84 car ensuite la boucle ne s'arrête pas .

ou il faudrait peut être attendre des heures

Bon je vous livre ce code modifié et ses résultats. y'a surement moyen de détourner la chose , il faudrait juste savoir ce que l'on cherche à obtenir.


Le code suivi du fichier résultats
Code:
Sub tutu()
Dim n As Integer, p As Long
Dim Mem As Integer
Dim Pic As Integer
  Randomize
  Pic = 0
Do
 Mem = 0: p = 0
    Range("A" & Range("A" & Rows.Count).End(xlUp).Row + 1).Resize(1, 2) = Array(n, Timer)
  Do: n = 0: p = p + 1: Do While Int(6 * Rnd): n = n + 1:  Loop
   DoEvents:
   Application.StatusBar = n & " " & p
   If n > Mem Then
     Mem = n
     Range("A" & Range("A" & Rows.Count).End(xlUp).Row + 1).Resize(1, 3) = Array(n, Timer, p)
   End If
   Loop While n < Pic
  Range("A" & Range("A" & Rows.Count).End(xlUp).Row + 1).Resize(1, 4).Value = Array(n, Timer, p, Pic)
  Pic = Pic + 1
Loop Until Pic = 85

End Sub
 

Pièces jointes

  • Aléatoire.xlsm
    34.8 KB · Affichages: 40
  • Aléatoire.xlsm
    34.8 KB · Affichages: 45

pierrejean

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

Re

Par curiosité quelqu'un a-t-il testé:

Code:
Sub tata()
Dim n&, p&  
  Do: n = 0: p = p + 1: Randomize: Do While Int(6 * Rnd): n = n + 1: Loop: Loop While n < 84
  [A1].Resize(1, 2).Value = Array(n, p)
End Sub

Randomize placé différemment
 

job75

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

Re,

Je viens de tester ta proposition Pierre, avec 80 ça passe mais ça prend un peu de temps.

J'ai obtenu in fine n = 81 p = 115 499 031.

Alors qu'en moyenne on doit avoir un cas sur 1/(5/6)^80 = 2 160 228.

Curieux en effet.

A+
 

Si...

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

re

pierrejean, même punition chez moi avec cette position du Randomize.
Je me rabats sur
Code:
Sub toto()
  Dim n&, p&
 Do
    n = 0: p = p + 1:  Do:  n = n + 1: Loop While Int(6 * Rnd): Loop While n < 85
  [A1].Resize(1, 2).Value = Array(n, p)
End Sub

qui s'arrête avec p= 2 796 203 mais qui reprend ses caprices avec 86...
 

pierrejean

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

Re

Je me suis posé la question de savoir si Excel n'avait pas de problème pour évaluer rapidement Int(6*Rnd)
Par expérience je sais qu'il y a des Pb pour un dictionnaire dico a écrire directement dico(range("A"& n))
J'ai donc modifié la tata de ROGER
et quelques tests m'ont conduit au fichier ci-inclus
Par contre je me perds en conjectures quant à ce max de 84 !!!!
 

Pièces jointes

  • Randomize.xlsm
    18.2 KB · Affichages: 37
  • Randomize.xlsm
    18.2 KB · Affichages: 42
  • Randomize.xlsm
    18.2 KB · Affichages: 45

Discussions similaires

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

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 247
Messages
2 086 591
Membres
103 248
dernier inscrit
Happycat