GÉNÉRATEUR DE COMBINAISONS LOTO

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 14 juil. 2012 à 14:27
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 23 juil. 2012 à 09:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54444-generateur-de-combinaisons-loto

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 août 2023
23 juil. 2012 à 02:29
MAJ
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
22 juil. 2012 à 23:11
Bonsoir,

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.
shaeks Messages postés 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 août 2023
22 juil. 2012 à 20:25
Bonsoir,

J'ai ajouté une boucle Do...Loop.

Cdt,
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 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és 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 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és 157 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 11 juillet 2022 4
15 juil. 2012 à 01:13
Regarde sur se poste, NHenry m'avais aidé pour tirer des nombres au hasard sans avoir de "doublon" :
http://www.vbfrance.com/forum/sujet-NOMBRE-ALEATOIRE-DIFFERENT_1483394.aspx
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 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és 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 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és 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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és 26 Date d'inscription mercredi 27 juillet 2005 Statut Non membre Dernière intervention 19 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és 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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.
Rejoignez-nous