2010-08-10 6 views
2

J'ai le code suivant qui génère un nombre aléatoire. entre 1 et 10. Cela fonctionne bien. Mais, je ne veux pas doubler en combobox (cmbRnd est ma combo box). Comment puis-je l'éviter?Évitez de doubler dans la zone de liste déroulante

Private Sub cmdRnd_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdRnd.Click 
    Dim random As New Random(), i As Integer = 1 
    Do While i < 10 
     cmbRnd.Items.Add(random.Next(1, 10)) 
     i = i + 1 
    Loop 
End Sub 

Répondre

2

Une meilleure façon est de générer un tableau de nombres 1-10, puis mélangez.

La façon la plus simple des numéros de brassage est de les trier au hasard:

Dim rng As New Random() 
Dim numbers As Integer() = Enumerable.Range(1, 10).OrderBy(_ 
    Function(x) rng.Next()).ToArray() 

Ensuite, s'il vous plaît lire pourquoi les numéros traînants comme celui-ci is a bad idea! and how to do it better.

Une remarque sans rapport avec:

Ne pas utiliser une boucle While pour itérer sur les chiffres. Ce cas d'utilisation spécial est mieux mappé par la boucle For et les personnes regardant votre code se demanderont pour quelle raison la boucle For a été évitée. La cohérence est parfois un peu stupide, mais dans des cas aussi bien établis, il n'y a pas de raison de s'écarter de la norme.

+0

L'idée est superbe mais votre code a généré une erreur Pourriez-vous elloborer comment mélanger et ensuite les ajouter à une zone de liste déroulante? Merci et meilleures salutations, Furqan –

+0

@ user415037: S'il vous plaît essayez à nouveau - il y avait * une * erreur dans le code, désolé. En outre, mon code utilise Linq qui a été introduit dans la version précédente de Visual Studio (VS2008). Et le code peut exiger 'Imports System.Linq' au début du fichier (j'ai oublié de le mentionner). –

+0

+1 Bonne réponse. Une question. Votre algorithme souffre-t-il du même biais statistique que l'algorithme "naïf" de Jeff? Votre algorithme n'échange pas de paires, mais assigne un nombre aléatoire à chaque entrée, puis trie l'ensemble entier par les nombres aléatoires. Alors peut-être ne souffre-t-il pas du même problème de "overswapping" de certaines entrées? – MarkJ

0
Dim random As New Random(), i As Integer = 1 
Dim cmbRnd As New Windows.Forms.ComboBox 
Do While i < 10 
    Dim newItem As Int32 = random.Next(1, 10) 
    If Not cmbRnd.Items.Contains(newItem) Then 
     cmbRnd.Items.Add(newItem) 
     i = i + 1 
    End If 
Loop 
+1

Bien qu'étant statistiquement fiable, ce code va probablement être assez lent, même pour un très petit nombre. –

+0

@Konrad Rudolph: ce code est exactement ce que le PO a demandé. Il existe des méthodes nettement plus rapides, mais si vous regardez à nouveau son code source, vous verrez que les performances n'ont pas vraiment d'importance dans un gestionnaire de boutons pour 10 éléments. J'ai donc fourni le moyen le plus simple pour vérifier si une collection contient un objet. –

+0

Oui, et votre réponse a reçu un ** upvote ** de ma part. Mon commentaire a été conçu comme un "oh, au fait," pas comme une raison downvote. –

Questions connexes