Gestion des Nombres aléatoires [Résolu]

Messages postés
10
Date d'inscription
mercredi 19 juin 2013
Statut
Membre
Dernière intervention
9 juillet 2015
- - Dernière réponse : 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!
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
10
Date d'inscription
mercredi 19 juin 2013
Statut
Membre
Dernière intervention
9 juillet 2015
3
Merci
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....

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 189 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_chambers
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
14569
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
20 octobre 2019
136
0
Merci
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
Commenter la réponse de NHenry
Messages postés
149
Date d'inscription
lundi 24 décembre 2007
Statut
Membre
Dernière intervention
16 juillet 2013
2
0
Merci
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
Commenter la réponse de alexandrevandenberghe
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
149
Date d'inscription
lundi 24 décembre 2007
Statut
Membre
Dernière intervention
16 juillet 2013
2
0
Merci
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
Commenter la réponse de alexandrevandenberghe
0
Merci
Bonjour,

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


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
10
Date d'inscription
mercredi 19 juin 2013
Statut
Membre
Dernière intervention
9 juillet 2015
0
Merci
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...
Commenter la réponse de cs_chambers
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
10
Date d'inscription
mercredi 19 juin 2013
Statut
Membre
Dernière intervention
9 juillet 2015
0
Merci
Non y a pas de problème, je te comprends; mais en tout cas, merci
Commenter la réponse de cs_chambers