Plusieurs chiffres sans doublon

Résolu
glenat_26 Messages postés 10 Date d'inscription vendredi 8 février 2019 Statut Membre Dernière intervention 12 mars 2019 - 8 févr. 2019 à 16:15
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 - 9 févr. 2019 à 12:04
Je voudrais savoir comment sortir des chiffres aléatoire sans doublon dans environ 5 ou plus textbox.
J'ai essayer comme sa, mais cela ne fonctionne pas.

Dim q As Integer

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

TextBox1.Text = Int(20 * Rnd())
TextBox2.Text = Int(20 * Rnd())
TextBox3.Text = Int(20 * Rnd())
TextBox4.Text = Int(20 * Rnd())
TextBox5.Text = Int(20 * Rnd())
TextBox6.Text = Int(20 * Rnd())

q = q + 1
End Sub

A voir également:

2 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
8 févr. 2019 à 17:23
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
9 févr. 2019 à 12:04
Tu trouveras un exemple pour ton cas particulier ici:

https://codes-sources.commentcamarche.net/forum/affich-10066528-tirage-aleatoire#p10094343

@+ Le Pivert
0
Whismeril Messages postés 19055 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 12 juin 2024 657
Modifié le 8 févr. 2019 à 17:34
Bonjour

ton problème maintenant.
Tu ne veux pas de doublons, or tu génères n nombres aléatoires sans plus de restriction, donc la probabilité d'avoir des doublons est forte (1 chance sur 20 dans ton cas).

Ce qu'il est possible de faire:
  • créer une collection de résultats (une List(Of ) par exemple)
  • générer un aléatoire et le stocker dans la collection
  • générer un autre aléatoire est vérifier qu'il n'est pas dans la liste, s'il y est => nouvelle génération, s'il n'y est pas, on le stocke dans la liste
  • générer un autre aléatoire est vérifier qu'il n'est pas dans la liste, s'il y est => nouvelle génération, s'il n'y est pas, on le stocke dans la liste
  • etc


le problème de cette méthode est que si on veut faire un tirage avec une grande partie (ou tous) les possibles, ça va être long.
Par exemple, si tu dois distribuer un jeu de 54 cartes, à la 54° tu auras une chance sur 54 de trouver la carte qui n'est pas dans la liste et 53 sur 54 de générer une carte déjà tirée. Donc tu tombes à coté, et tu recommences, avec exactement les mêmes probabilités.
Ça peut durer un moment.

Une méthode qui fonctionne facilement et rapidement est de créer la collection de tous les possibles, de la mélanger et de prendre les n premiers résultats.

    Dim tirage As List(Of Integer) = Enumerable.Range(0, 20).OrderBy(Function(x) Guid.NewGuid()).ToList()
    Dim res1 As Integer = tirage(0)
    Dim res2 As Integer = tirage(1)


Enumerable.Range(0, 20)
va générer une suite de 20 entiers qui commence par 0.
OrderBy(Function(x) 
va trier la collection en entrée en fonction d'un critère, en général le critère dépend d'une ou plusieurs propriété de la collection d'entrée. Par exemple des personnes peuvent être triées sur leurs noms, leurs âges, leurs tailles etc....

Dans notre cas on va trier sur un truc aléatoire
Guid.NewGuid()
un Guid est encore plus aléatoire que la fonction Random, il génère un Hash Code.

Età la fin on en fait une liste
.ToList()




0
Rejoignez-nous