Gestion des Nombres aléatoires

Résolu
cs_chambers Messages postés 10 Date d'inscription mercredi 19 juin 2013 Statut Membre Dernière intervention 9 juillet 2015 - 15 juil. 2013 à 18:21
cs_chambers Messages postés 10 Date d'inscription mercredi 19 juin 2013 Statut Membre Dernière intervention 9 juillet 2015 - 18 juil. 2013 à 15:49
Salut!
J'ai fait un petit programme qui permet de générer des nombres aléatoires; le programme marche mais, il y a un petit problème; c'est que le programme peut retourner plusieurs fois un même nombre. Alors, j'ai essayé de modifier le programme mais, ce dernier plante seulement . voici mes codes:
Private Sub Command1_Click()
Dim i, j, n, tableau(6)
     Randomize
    For i = 1 To 6 Step 1       'Boucle pour le remplissage du tableau
debut:
    n = Int(((6 - 1) * Rnd) + 1)
        For j = 1 To i Step 1   'Boucle pour la recherche
            If n <> tableau(j) Then   'Si le nombre aléatoire est différent des nombres
                tableau(i) = n        'existants dans le tableau
            Else        'Si le nombre aléatoire est égal à au moins 1 nombre du tableau
                GoTo debut       'Retourner pour prendre un autre nombre aléatoire
            End If
        Next j
        Form1.Print tableau(i)     'Affichage du résultat sur la feuille
    Next i
End Sub

S'il vous plait, j'ai vraiment besoin de votre point de vue.
Merci d'avance!

12 réponses

cs_chambers Messages postés 10 Date d'inscription mercredi 19 juin 2013 Statut Membre Dernière intervention 9 juillet 2015
18 juil. 2013 à 15:49
Bonjour cheyenne,
excusez moi, là où je me trouve on a un vrai problème de connexion; sinon j'aimerais vous remercier du fond de cœur, grâce à vous, j'ai pu retrouver mon erreur et vos codes marchent à merveille, et je comprends parfaitement vos codes, alors je vous dis chapeau!
Quant à vous alexandrevandenberghe, vos codes ne vont pas avec ma préoccupation, mais cela ne m'empêche pas à vous remercier pour votre aide.
Pour une fois, vraiment merci....
3
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
15 juil. 2013 à 19:23
Bonjour,

Tes variables sont bien déclarées mais pas typées.
Mettre Randomize dans Form Load ou Initialize. Un seul appel suffit, c'est inutile de mettre l'instruction dans la procédure.
Step 1 est inutile, par défaut c'est 1 en sens ascendant. Par contre, si tu décrémentes le compteur de boucle Step est nécéssaire.
Ne pas employer de GoTo, vestige des anciens Basic. (C'est ce que l'on appelle de la programmation spaghetti).
Regardes bien ce que fait ce code et reviens si tu ne comprends pas le mécanisme.
Dim i As Integer, n As Integer
Dim tableau(1 to 6) As Integer
Randomize
For i = 1 To 6
   Do
      n = Int(6 * Rnd + 1)
   Loop Until tableau(n) = 0
   tableau(n) = n
   Print n
Next i

Cheyenne
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
15 juil. 2013 à 19:30
Bonjour,

Aaaaarg :
GoTo debut

JAMAIS de GOTO sans raison claire.
As-tu essayer de faire une collection (New Collection) et de mettre tout les nombres dedans pour les retirer 1 par 1 ?

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
Utilisateur anonyme
16 juil. 2013 à 14:09
Bonjour à tous,

Si j'ai bien compris ta problematique, ta boucle n'est pas bonne :

For j = 1 To i Step 1
  If n <> tableau(j) Then
    tableau(i) = n
  Else
    GoTo debut
  End If
Next j


Clairement :
Si en position j de ton tableau tu n'as pas la valeur n alors la position i de ce tableau prend la valeur n

Tu devrais essayer ce code :
Dim trouvé As Boolean = False
For j = 1 To i Step 1
  If n = tableau(j) Then
    trouvé = True
  End If
Next j
If Not trouvé Then
  tableau(i) = n
Else
  GoTo debut
Endif
0

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

Posez votre question
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
16 juil. 2013 à 15:13
Bonjour alexandrevandenberghe,

Pourquoi persister à utiliser un GoTo ?
De plus ce GoTo fait sortir sauvagement de la boucle i, ce qui n'est pas très élégant.
Je pense que mon code est beaucoup plus compact et rationnel du fait de la suppression de la boucle j.

Cheyenne
0
Utilisateur anonyme
16 juil. 2013 à 15:36
Salut Cheyenne,

J'ai laissé le Goto juste pour corriger le code que Chambers a donné, je ne suis pas non plus pour les Goto...

Je n'avais pas compris que le code que tu as donné était aussi une correction, parce que je ne comprend pas ta clause : "Until tableau(n) = 0", pourquoi utilises tu la variable n comme indice du tableau? (Ce n'est pas une critique, c'est juste pour comprendre)

Parce que sinon je l'aurai ecrit comme ceci :

  Dim i As Integer, j As Integer, n As Integer
  Dim tableau(1 to 6) As Integer

  Randomize

  WHILE i < 6
    n = Int(((6 - 1) * Rnd) + 1)

    Dim trouvé As Boolean = False
    For j = 1 To i Step 1
      If n = tableau(j) Then
        trouvé = True
      End If
    Next j
    If Not trouvé then
      tableau(i) = n
      Form1.Print tableau(i)
      i = i + 1
    End if
  WEND
0
Utilisateur anonyme
16 juil. 2013 à 16:00
Bonjour,

alexandrevandenberghe:
C'est du VB.Net ton code...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
16 juil. 2013 à 17:49
Re,
"Until tableau(n) = 0" pourquoi utilises tu la variable n comme indice du tableau?
Tout simplement afin de ne pas avoir un chiffre déjà tiré au hazard.
Exemple : on sort un 3, donc tableau(3) = 3
au prochain tour le 3 sort encore, comme l'indice 3 du tableau n'est pas à 0 on reessayes un autre chiffre jusqu'à ce qu'il soit différent de 3.
IL est vrai que j'aurais pu utiliser un tableau boolean, plus "parlant" :
Dim i As Integer, n As Integer
Dim tableau(1 To 6) As Boolean
Randomize
For i = 1 To 6
   Do
      n = Int(6 * Rnd + 1)
   Loop Until tableau(n) = False
   tableau(n) = True
   Print n
Next i

Est-ce ainsi plus compréhensible ?
10 lignes pour 17 avec ton code qui a toujours 2 boucles et je n'en vois pas la nécessité...

Cordialement de Cheynne
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
17 juil. 2013 à 12:54
Hé ho chambers, réveille toi !

Tu as demandé notre point de vue et tu l'as eu, alors si les réponses te conviennent il faut valider la ou les réponses adéquates.
Ou du moins réagir, ne serait-ce que par politesse envers les contributeurs qui ont pris la peine de te répondre.

Cheyenne
0
cs_chambers Messages postés 10 Date d'inscription mercredi 19 juin 2013 Statut Membre Dernière intervention 9 juillet 2015
17 juil. 2013 à 15:02
Bonjour cheyenne,
excusez moi, là ou je me trouve on a un vrai problème de connexion; sinon j'aimerais vous remerciez du fond de coeur, grâce à vous, j'ai pu retrouvé mon erreur et vos codes marchent à merveille, et je comprends parfaitement vos codes, alors je vous dit chapeau!
Quant à vous alexandrevandenberghe, votre code ne va pas avec ma préoccupation, mais cela ne m'empêche pas à vous remercier pour votre aide.
Pour une fois, vraiment merci...
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
17 juil. 2013 à 15:49
Bonjour chambers,

Ok, c'est vrai que j'étais un peu impatient d'avoir le suivi de mes réponses...
N'hésites pas à revenir si tu as un problème de code.

Bonne continuation,

Cheyenne
0
cs_chambers Messages postés 10 Date d'inscription mercredi 19 juin 2013 Statut Membre Dernière intervention 9 juillet 2015
17 juil. 2013 à 18:40
Non y a pas de problème, je te comprends; mais en tout cas, merci
0
Rejoignez-nous