Boucle de 1000

Résolu
Natasha75 - 26 oct. 2012 à 15:54
 Utilisateur anonyme - 28 oct. 2012 à 09:36
Bonjour, je suis nouvelle sur ce site et j'ai un petit problème, car je suis débutante en programmation!

Dans mes cours, nous devons effectuer une boucle sur 500 nombres au hasard entre les chiffres 1 à 10, incluant ces bornes. Après cette boucle, je dois afficher le nombre qui est sorti le plus souvent entre 1 et 10 et la quantité de fois qu'il a sorti.

Je dois ensuite afficher tous les autres incluant le nombre de fois qu'ils sont sorti et le tout doit être affiché dans un label.

Mon problème est que je ne me rappelle pas comment effectuer une boucle sur un nombre x (ici 500) entre une série de chiffres (ici de 1 à 10). Pour l'afficher dans un label il n'y a pas de souci, cela j'y arrive. ;)

Merci de votre aide!

19 réponses

Utilisateur anonyme
26 oct. 2012 à 18:39
Oui ca c'est la seconde étape
(bien vu pour Random j'étais resté en VB6)

Donc, je propose de stocker dans un tableau de 10 cases le nombre de fois qu'une valeur est sortie pour chaque indice

Dim totaux(9) As Integer ' 0..9 => 10 cases
For i = 1 To 500
    totaux(r.Next(0, 10)) += 1
Next


' Recherche de l'indice de la plus grande valeur
Dim iMax As Integer = 0
For i = 1 To 9
  If totaux(i) > totaux(iMax) Then
    iMax = i
  End If
Next


Dans iMax tu aura le nombre qui est sortie le plus de fois (attention, iMax va de 0 à 9)
Pour savoir combiens de fois il est sortie, juste un appel de la valeur du tableau totaux(iMax)

Vlà

_____________
Kenji
3
Plus précisément, je ne suis pas certaine si je dois démarer mon calcul avec un While, For ou autres pour effectuer la boucle. Chaque fois, je tappe un mur!
0
Utilisateur anonyme
26 oct. 2012 à 16:43
Bonjour,

Le schéma type de la boucle que tu souhaite faire est le suivant:

Dim x As Integer
For x = 1 To 500
  ' 
Next x


Après pour obtenir un chiffre aléatoire, la fonction Rnd te retourne un nombre entre 0 et 1. Une simple transformation te retournera le nombre entre 1 et 10.

Voilà déjà ca, je te laisse mouliner tout ca avant de passer à la suite

_____________
Kenji
0
Oui pour le début ca va mais pour la suite, je bloque sur le calcul entre 1 et 10 et pour afficher le nombre qui est sorti le plus souvent et les 9 autres avec le nombre de fois également...

'Innitialisation
        Dim total As Integer
        Dim i As Integer
        Dim r As New Random

        'La boucle
        For i = 1 To 500
            total = r.Next(1, 10)

        Next
        'Résultat
        Me.lblResultat.Text = total
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
merci pour ton aide, cela fonctionne très bien. ;)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 oct. 2012 à 14:39
Bonjour,
ouais ...
1) pourquoi démarrer avec max = 0 ? scabreux si existence de nombres négatifs.
2) je découvre avec assez d'étonnement que Math.Max ne saittravailler qu'avec 2 valeurs ! Dommage !
mais dans ce cas, ceci devrait alors faire l'affaire :
Dim iMax As Integer = totaux(1)
For i = 2 To 9
  imax = math.max(toto(i-1),totaux(i)
Next

Enfin ... il me semble, puisque je ne peux tester, n'ayant pas VB.Net.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Utilisateur anonyme
27 oct. 2012 à 14:43
Pour répondre à ton 1) et ton 2)
Il fallait ici récupéré l'indice et non la valeur

_____________
Kenji
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 oct. 2012 à 18:34
de toutes manières :
lire (correction d'une faute de frappe)
imax = math.max(imax),totaux(i)
je dois afficher le nombre qui est sorti le plus souvent

J'y vois la recherche du nombre, pas de l'indice.
Mais je n'avais pas tout lu de la demande, me focalisant à tort sur le max. En relisant ===>> c'est une collection (ou également un dictionnaire) qu'il lui faut utiliser, ce qui lui permettra de ne pas recommencer une boucle pour chaque valeur.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 oct. 2012 à 21:38
Pour illustrer ce dont je parlais :
Un petit exercice en vB6, à transposer (devrait être fastoche, non, en VB.Net)
'================= juste pour avoir un tableau pour y travailler
 Dim nb As Long
  nb = 500
  ReDim tablo(nb - 1)
  For i = 0 To nb - 1
    tablo(i) = Int(((10 - 1) * Rnd) + 1)
  Next

 ' ====================et maintenant : on travaille
  Set dico = CreateObject("Scripting.Dictionary")
  For i = 0 To UBound(tablo)
    If Not dico.Exists((tablo(i))) Then
      dico.Add tablo(i), 1
    Else
      dico.Item(tablo(i)) = Val(dico.Item(tablo(i)) + 1)
    End If
  Next
  
  ' ================== juste pour en faire la preuve
  a = dico.Keys
  For i = 0 To dico.Count - 1
    MsgBox vbCrLf & a(i) & " est présent " & dico.Item(tablo(i)) & " fois"
  Next

On voit bien que l'on obtient ainsi le nombre exact d'occurrences de chaque éléments du tableau.
Le reste ? Déterminer le nombre qui apparait le plus grand nombre de fois ? Trop fastoche (un minuscule ajout dans la dernière boucle) pour que j'accepte de m'y attarder !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Utilisateur anonyme
27 oct. 2012 à 22:01
HeuMouwis .... c'est vrai, mais pourquoi ???
Niveau performance, bah heu .......
Bon et si nb = 100000000 ?

Plus sérieusement, Natasha débute, je pense que répondre à son problème de la façon la plus évidente et la plus simple possible reste plus adapté.

_____________
Kenji
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 oct. 2012 à 22:13
Certes, Charles, mais voilà ce qu'il voulait :
Dans mes cours, nous devons effectuer une boucle sur 500 nombres au hasard entre les chiffres 1 à 10, incluant ces bornes. Après cette boucle, je dois afficher le nombre qui est sorti le plus souvent entre 1 et 10 et la quantité de fois qu'il a sorti.

Je dois ensuite afficher tous les autres incluant le nombre de fois qu'ils sont sorti et le tout doit être affiché dans un label.

et mon petit doigt me dit que la "manière simple" n'y a pas répondu.




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Utilisateur anonyme
27 oct. 2012 à 22:21
Allez hop, la suite du code simple que j'avais laissé le soin à Natasha de coder

Const nb As Long = 500
Dim i As Long
Dim totaux(9) As Long ' 0..9 => 10 cases


For i = 1 To nb
  Dim A As Integer: A = Int((10 * Rnd))
  totaux(A) = totaux(A) + 1
Next
  

' Recherche de l'indice de la plus grande valeur
Dim iMax As Integer: iMax = 0
For i = 1 To 9
  If totaux(i) > totaux(iMax) Then
    iMax = i
  End If
Next


' le nombre qui est sorti le plus souvent
MsgBox "Le nombre qui est sortie le plus de fois est " & iMax + 1 & " (" & totaux(iMax) & " fois)"

' tous les autres incluant le nombre de fois qu'ils sont sorti
For i = 0 To 9
  MsgBox i + 1 & " est présent " & totaux(i) & " fois"
Next i



_____________
Kenji
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 oct. 2012 à 22:22
Par ailleurs :
HeuMouwis .... c'est vrai, mais pourquoi ???
Niveau performance, bah heu .......
Bon et si nb = 100000000 ?

Justement : plus le nombre est grand, plus l'utilisation d'un dictionnaire montrera sa très grande supériorité en matière de vitesse du traitement par rapport à d'autres méthodes
Mais si tu veux vraiment une méthode simple, "à la portée d'un débutant", je te suggère alors celle-ci :
1) trier le tableau par ordre décroissant
2) le parcourir en boucle For to Next et compter, pour chaque article, non nombre d'occurrences (simple boucle while "il est le même").
Le 1er étant forcément le plus élevé (son max).
Allons ...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 oct. 2012 à 23:01
Bon...
Je viens de réaliser que l'on peut compter en ajoutant, compte tenu de la première phrase du demandeur.
Ta démarche est donc fondée.
Il te faut cependant la corriger (je te laisse le faire).
Car j'ai voulu y regarder de près et voilà (en reprenant ton code, mais en le "surveillant") :
Const nb As Long = 20 ' je n'en ai mis que 20 (tirages) pour ne pas m'esquinter la vue
Dim i As Long
Dim totaux(9) As Long ' 0..9 => 10 cases
Dim titi As String
List1.Clear
For i = 1 To nb
  Dim A As Integer: A = Int((10 * Rnd))
  totaux(A) = totaux(A) + 1
 titi = titi & " " & A
Next
  

' Recherche de l'indice de la plus grande valeur
Dim iMax As Integer: iMax = 0
For i = 1 To 9
  If totaux(i) > totaux(iMax) Then
    iMax = i
  End If
Next

msg = "tiré " & titi
' le nombre qui est sorti le plus souvent
msg = msg & vbCrLf & "Le nombre qui est sortie le plus de fois est " & iMax + 1 & " (" & totaux(iMax) & " fois)"

' tous les autres incluant le nombre de fois qu'ils sont sorti
For i = 0 To 9
 msg = msg & vbCrLf & i + 1 & " est présent " & totaux(i) & " fois"
Next i
MsgBox msg

Pas probant. A corriger.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 oct. 2012 à 23:10
La voilà, ta correction :
Const nb As Long = 20
Dim i As Long
Dim totaux(9) As Long ' 0..9 => 10 cases
Dim titi As String
List1.Clear
For i = 1 To nb
  Dim A As Integer: A = Int((10 - 1) * Rnd) + 1
  totaux(A - 1) = totaux(A - 1) + 1
 titi = titi & " " & A
Next
  

' Recherche de l'indice de la plus grande valeur
Dim iMax As Integer: iMax = 0
For i = 1 To 9
  If totaux(i) > totaux(iMax) Then
    iMax = i
  End If
Next

msg = "tiré " & titi
' le nombre qui est sorti le plus souvent
msg = msg & vbCrLf & "Le nombre qui est sortie le plus de fois est " & iMax + 1 & " (" & totaux(iMax) & " fois)"

' tous les autres incluant le nombre de fois qu'ils sont sorti
For i = 0 To 8
 msg = msg & vbCrLf & i + 1 & " est présent " & totaux(i) & " fois"
Next i
MsgBox msg

A dans 10 jours ...
Amitiés

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Utilisateur anonyme
27 oct. 2012 à 23:33
Heu la tu fais un rand sur 1..9, peut-être que tu voulais faire sur 1..10 plutôt.
Mais entre faire un rand sur 1..10 et retirer 1 au lieu d'un rand sur 0..9, tu chipote la

Enfin bon, va falloir peut-être clore ce sujet sinon va pas s'arrêter et on va nous prendre pour des fous

_____________
Kenji
0
Utilisateur anonyme
28 oct. 2012 à 00:27
Bonsoir,

Pour info, en .NET, il est préférable d'utiliser les listes fortement typées 'List Of' plutôt que les tableaux (beaucoup plus lents).

A dans 10 jours ...
Bon voyage ucfoutu

sinon va pas s'arrêter et on va nous prendre pour des fous
mais non voyons c'est déjà fait
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 oct. 2012 à 08:37
10 inclus ? ===>>
Const nb As Long = 20
Dim i As Long, imax As Long
Dim totaux(1 To 10) As Long ' 0..9 => 10 cases
Dim titi As String
For i = 1 To nb
Dim A As Integer: A = Int((10) * Rnd) + 1
totaux(A) = totaux(A) + 1
If totaux(A) > imax Then imax = A
titi = titi & " " & A
Next
msg = "tiré " & titi
msg = msg & vbCrLf & "Le nombre qui est sortie le plus de fois est " & imax & " (" & totaux(imax) & " fois)"
For i = 1 To 10
msg = msg & vbCrLf & i & " est présent " & totaux(i) & " fois"
Next i
MsgBox msg


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
Utilisateur anonyme
28 oct. 2012 à 09:36
Avec
If totaux(A) > totaux(iMax) Then iMax = A
au lieu de
If totaux(A) > imax Then imax = A

Et ca marche

Par contre en vb.net, les tableaux commencent tous à 0, c'est pour ca que j'avais fais de 0..9. Remarque on peut toujours laisser la case 0 vide.

Pour info, en .NET, il est préférable d'utiliser les listes fortement typées 'List Of' plutôt que les tableaux (beaucoup plus lents).


En général oui, mais pour ce genre de travail sur un tableau de 10 cases d'entiers, je pense que c 'est préférable (testes de performences à effectuer) et surtout plus simple pour débuter.

_____________
Kenji
0
Rejoignez-nous