NHenry
Messages postés15118Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention11 mai 2024159 23 juil. 2012 à 09:23
Bonjour,
Je n'ai pas regardé si il y avait encore un risque de doublon, mais voici un exemple de code qui fait ce que tu veux (Code tapé hors EDI, risque d'erreur) :
Dim lRnd As Random()=New Random()
Dim i as Integer
Dim lTmp as integer
Dim lLstNb As List(of Integer)= New List(of Integer)
'Nombre de Nombre à générer
Dim lMaxNb=5
Do While lLstNb.Count<lMaxNb
lTmp=lRnd.Next(1,49)
For i=0 to lLstNb.Count-1
If lLstNb(i)=lTmp Then
Continue Do 'Doublon, on rejette
End If
Next i
lLstNb.Add(lTmp) 'Pas de doublon, on prend
Loop
'Affichage
For i = 1 To 6
Me.Controls("LblNb" & i).Text = (lLstNb(i - 1)).ToString()
Next i
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 23 juil. 2012 à 02:29
MAJ
NHenry
Messages postés15118Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention11 mai 2024159 22 juil. 2012 à 23:11
Concernant l'espace de nom, c'est une rétro compatibilité avec du VB6, donc à éviter en .NET, ça n'apporte rien.
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 22 juil. 2012 à 20:27
@NHenry : Est ce que tu peux me fournir un lien qui explique l'utilité de ce qui suit :
"1) Actives Option Strict et Oprion Explicit
2) Retires l'import automatique de l'espace de nom Microsoft.VisualBasic
(Pour les 2 premiers points, voir ma signature sur le forum)"
Merci
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 22 juil. 2012 à 20:25
Bonsoir,
J'ai ajouté une boucle Do...Loop.
Cdt,
NHenry
Messages postés15118Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention11 mai 2024159 18 juil. 2012 à 19:33
Bonsoir,
HORREUR, MALHEUR, HONTE, UN GOTO !!!!!!
Vires-moi ce GOTO !!!
Si tu dois reboucler, une boucle Do/Loop avec un booléen, est nettement plus propre.
Il y a aussi Exit Sub/For/Do/... qui peut être utilisé.
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 18 juil. 2012 à 13:31
Bonjour NHenry,
Tu peux me fournir stp le lien qui parle de la "signature". (option explicit, option strict...etc)
Merci
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 18 juil. 2012 à 12:19
Bonjour NHenry,
Désolé pour ce retard. Tu peux analyser ce nouveau code je crois qu'il est clean. La nouveauté c'est l'instruction GO TO LINE1 au lieu de i=0.
Mais pour tes premiers conseils je n'ai rien compris. (à quoi ca va nous servir ?)
Amicalement,
NHenry
Messages postés15118Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention11 mai 2024159 15 juil. 2012 à 14:02
Bonjour,
Je reste sur mes premiers conseils :
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).
Avec ton :
i = 0
Je pense qu'il y a un risque que le premier élément ne soit pas recontrolé.
Utilises plutot une boucle Do/Loop (tu pourrais remplacer les While/End While, par des Do Loop) avec un booléen qui signalera qu'un doublon a été détecté.
Cela sera beaucoup plus propre et ne cassera pas le fil d’exécution du code.
Pour sortir d'une boucle, regardes l'instruction Exit Do/For/Sub/Function/...
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 15 juil. 2012 à 03:11
J'ai oublié de vous le dire mais à la troisième mise à jour le problème des doublons a été résolu.
Guillamue06
Messages postés157Date d'inscriptiondimanche 18 avril 2004StatutMembreDernière intervention11 juillet 20224 15 juil. 2012 à 01:13
NHenry
Messages postés15118Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention11 mai 2024159 14 juil. 2012 à 20:19
Toujours pas, il me semble :
1 5 9 3 6 6
Tri :
1 3 5 6 6 9
Anti doublon :
1 3 5 6 1 9
Tir :
1 1 3 5 6 9
Il faut que tu recontroles l'ensemble du tableau à chaque fois que tu régénères un nombre.
Autre exemple :
6 8 4 6 9 6
Tri :
4 6 6 6 8 9
Anti doublon :
4 6 4 6 8 9
Tri :
4 4 6 6 8 9
2 doublons !!
Doublon.
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 14 juil. 2012 à 19:44
Bonjour NHenry,
J'ai changé A(i) par A(i+1). Dans ce cas
le code sort 2 7 6 9 5 6
je trie 2 5 6 6 7 9
Je change le doublon supposons qu'il va générer encore une fois un doublon avec le suivant
2 5 6 7 7 9
le contrôle va se faire sur A(3) =7 et A(3+1)=7
et il va regénérer A(3+1).
Je crois que cette fois on l'a eu :-)
NHenry
Messages postés15118Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention11 mai 2024159 14 juil. 2012 à 19:21
Ton code sort :
2 7 6 9 5 6
Tu trie :
2 5 6 6 7 9
Tu change les doublons
2 5 5 6 7 9
Tu tries :
2 5 5 6 7 9
Et tu affiches.
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 14 juil. 2012 à 19:20
Oui Nhenry c'est vrai je viens de le tester encore une fois et il a généré un doublon. Je vais ajouter deux petites instructions.
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 14 juil. 2012 à 18:56
Non c'est pas possible pcq le controle se fait sur le tableau trié. on aura 5 6 7 8 9 9.
NHenry
Messages postés15118Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention11 mai 2024159 14 juil. 2012 à 18:30
Avec ton nouveau code, il est possible d'avoir :
5 6 9 7 8 9
Donc un doublon, si il y a collision avec le 6.
shaeks
Messages postés26Date d'inscriptionmercredi 27 juillet 2005StatutNon membreDernière intervention19 août 2023 14 juil. 2012 à 18:04
Bonjour NHenry,
Merci infiniment pour tes recommandations je les ai prise dans ma mise à jour. Le code est devenu trop petit :-)
NHenry
Messages postés15118Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention11 mai 2024159 14 juil. 2012 à 14:27
Bonjour,
1) Actives Option Strict et Oprion Explicit
2) Retires l'import automatique de l'espace de nom Microsoft.VisualBasic
(Pour les 2 premiers points, voir ma signature sur le forum)
3) Étudier l'objet Random, elle met à dispo un membre permettant de générer un nombre aléatoire entre 2 bornes.
4) Pour les doublons, il est facile de faire une boucle qui génère un nombre tant qu'il y a doublon.
Ou alors, faire une collection des nombres possible et demander à extraire un élément (qui sera ensuite supprimé de la collection), comme ça, plus de pb de doublon.
5) Nommage des contrôles et des variables :
Button1 est moins explicite que BtnGenerer
Label1 est moins explicite que LblNb1
Concernant les variables :
Dim rnd As New Random()
Dim i As Integer
Dim j As Integer
Dim A As Double
Dim tempo As Integer
Dim b(5) As Byte
Autant Rnd, i et j ne me choquent pas, mais A et b, ne donnent pas d'indications sur leur usage.
Concernant Tempo, il me semble que le type Array (dont est dérivé Byte()) fourni une routine de tri intégrée.
J'espère que cela sera utile afin d'améliorer cette source.
23 juil. 2012 à 09:23
Je n'ai pas regardé si il y avait encore un risque de doublon, mais voici un exemple de code qui fait ce que tu veux (Code tapé hors EDI, risque d'erreur) :
Dim lRnd As Random()=New Random()
Dim i as Integer
Dim lTmp as integer
Dim lLstNb As List(of Integer)= New List(of Integer)
'Nombre de Nombre à générer
Dim lMaxNb=5
Do While lLstNb.Count<lMaxNb
lTmp=lRnd.Next(1,49)
For i=0 to lLstNb.Count-1
If lLstNb(i)=lTmp Then
Continue Do 'Doublon, on rejette
End If
Next i
lLstNb.Add(lTmp) 'Pas de doublon, on prend
Loop
'Affichage
For i = 1 To 6
Me.Controls("LblNb" & i).Text = (lLstNb(i - 1)).ToString()
Next i
23 juil. 2012 à 02:29
22 juil. 2012 à 23:11
Toujours faillible :
1 2 3 3 4 5
Bol=True
1 2 3 1 4 5
Bol=False
i=i+1
1 1 2 3 4 5
Car une fois le nombre régénéré, tu passes à la position suivante sans controler les précédentes.
Concernant Option Explicit : http://msdn.microsoft.com/fr-fr/library/y9341s4f.aspx
Strict : http://msdn.microsoft.com/fr-fr/library/zcd4xwzs.aspx
Concernant l'espace de nom, c'est une rétro compatibilité avec du VB6, donc à éviter en .NET, ça n'apporte rien.
22 juil. 2012 à 20:27
"1) Actives Option Strict et Oprion Explicit
2) Retires l'import automatique de l'espace de nom Microsoft.VisualBasic
(Pour les 2 premiers points, voir ma signature sur le forum)"
Merci
22 juil. 2012 à 20:25
J'ai ajouté une boucle Do...Loop.
Cdt,
18 juil. 2012 à 19:33
HORREUR, MALHEUR, HONTE, UN GOTO !!!!!!
Vires-moi ce GOTO !!!
Si tu dois reboucler, une boucle Do/Loop avec un booléen, est nettement plus propre.
Il y a aussi Exit Sub/For/Do/... qui peut être utilisé.
18 juil. 2012 à 13:31
Tu peux me fournir stp le lien qui parle de la "signature". (option explicit, option strict...etc)
Merci
18 juil. 2012 à 12:19
Désolé pour ce retard. Tu peux analyser ce nouveau code je crois qu'il est clean. La nouveauté c'est l'instruction GO TO LINE1 au lieu de i=0.
Mais pour tes premiers conseils je n'ai rien compris. (à quoi ca va nous servir ?)
Amicalement,
15 juil. 2012 à 14:02
Je reste sur mes premiers conseils :
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).
Avec ton :
i = 0
Je pense qu'il y a un risque que le premier élément ne soit pas recontrolé.
Utilises plutot une boucle Do/Loop (tu pourrais remplacer les While/End While, par des Do Loop) avec un booléen qui signalera qu'un doublon a été détecté.
Cela sera beaucoup plus propre et ne cassera pas le fil d’exécution du code.
Pour sortir d'une boucle, regardes l'instruction Exit Do/For/Sub/Function/...
15 juil. 2012 à 03:11
15 juil. 2012 à 01:13
http://www.vbfrance.com/forum/sujet-NOMBRE-ALEATOIRE-DIFFERENT_1483394.aspx
14 juil. 2012 à 20:19
1 5 9 3 6 6
Tri :
1 3 5 6 6 9
Anti doublon :
1 3 5 6 1 9
Tir :
1 1 3 5 6 9
Il faut que tu recontroles l'ensemble du tableau à chaque fois que tu régénères un nombre.
Autre exemple :
6 8 4 6 9 6
Tri :
4 6 6 6 8 9
Anti doublon :
4 6 4 6 8 9
Tri :
4 4 6 6 8 9
2 doublons !!
Doublon.
14 juil. 2012 à 19:44
J'ai changé A(i) par A(i+1). Dans ce cas
le code sort 2 7 6 9 5 6
je trie 2 5 6 6 7 9
Je change le doublon supposons qu'il va générer encore une fois un doublon avec le suivant
2 5 6 7 7 9
le contrôle va se faire sur A(3) =7 et A(3+1)=7
et il va regénérer A(3+1).
Je crois que cette fois on l'a eu :-)
14 juil. 2012 à 19:21
2 7 6 9 5 6
Tu trie :
2 5 6 6 7 9
Tu change les doublons
2 5 5 6 7 9
Tu tries :
2 5 5 6 7 9
Et tu affiches.
14 juil. 2012 à 19:20
14 juil. 2012 à 18:56
14 juil. 2012 à 18:30
5 6 9 7 8 9
Donc un doublon, si il y a collision avec le 6.
14 juil. 2012 à 18:04
Merci infiniment pour tes recommandations je les ai prise dans ma mise à jour. Le code est devenu trop petit :-)
14 juil. 2012 à 14:27
1) Actives Option Strict et Oprion Explicit
2) Retires l'import automatique de l'espace de nom Microsoft.VisualBasic
(Pour les 2 premiers points, voir ma signature sur le forum)
3) Étudier l'objet Random, elle met à dispo un membre permettant de générer un nombre aléatoire entre 2 bornes.
4) Pour les doublons, il est facile de faire une boucle qui génère un nombre tant qu'il y a doublon.
Ou alors, faire une collection des nombres possible et demander à extraire un élément (qui sera ensuite supprimé de la collection), comme ça, plus de pb de doublon.
5) Nommage des contrôles et des variables :
Button1 est moins explicite que BtnGenerer
Label1 est moins explicite que LblNb1
Concernant les variables :
Dim rnd As New Random()
Dim i As Integer
Dim j As Integer
Dim A As Double
Dim tempo As Integer
Dim b(5) As Byte
Autant Rnd, i et j ne me choquent pas, mais A et b, ne donnent pas d'indications sur leur usage.
Concernant Tempo, il me semble que le type Array (dont est dérivé Byte()) fourni une routine de tri intégrée.
J'espère que cela sera utile afin d'améliorer cette source.