2010-08-10 6 views
2

다음 코드는 임의 번호를 생성합니다. 1에서 10 사이입니다. 정상적으로 작동합니다. 하지만, 나는 combobox (cmbRnd 내 콤보 상자입니다) 배로 싶지 않아요. 어떻게 피할 수 있습니까?콤보 박스가 중복되지 않도록하십시오.

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 

답변

2

더 좋은 방법은 숫자 1 ~ 10의 배열을 생성 한 다음 셔플하는 것입니다. 셔플 번호

가장 쉬운 방법은 무작위로 정렬됩니다 :

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

다음,이 is a bad idea! and how to do it better 같은 이유 셔플 번호를 읽어 보시기 바랍니다.

관련이없는 발언 :

숫자 반복에 대한 While 루프를 사용하지 마십시오. 이 특별한 사용 사례는 For 루프에 더 잘 매핑되며 코드를 보는 사람들은 For 루프를 피한 이유가 무엇인지 궁금해 할 것입니다. 일관성은 때로는 어리 석으나, 잘 정립 된 경우에는 표준에서 벗어날 이유가 없습니다.

+0

아이디어가 멋지지만 코드에서 오류가 발생했습니다 셔플하는 방법을 잊어 버린 다음 콤보 상자에 추가 할 수 있습니까? 감사합니다. 잘 부탁드립니다. Furqan –

+0

@ user415037 : 다시 시도해주십시오. 코드에 오류가있었습니다. 죄송합니다. 또한, 내 코드는 Visual Studio (VS2008)의 이전 릴리스에서 소개 된 Linq를 사용합니다. 그리고 코드는 파일의 시작 부분에'Imports System.Linq'을 요구할 수도 있습니다 (나는 그 사실을 잊어 버렸습니다). –

+0

+1 좋은 답변입니다. 하나의 질문. 귀하의 알고리즘은 Jeff의 귀하의 링크에있는 "순진한"알고리즘과 동일한 통계적 편향을 겪고 있습니까? 알고리즘은 쌍을 교환하지 않지만 각 항목에 임의의 숫자를 할당 한 다음 전체 세트를 임의의 숫자로 정렬합니다. 따라서 아마도 일부 항목을 "오버플로"하는 것과 같은 문제가 발생하지 않을 수 있습니까? – 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

통계적으로는 소리가 나기는하지만이 코드는 매우 적은 수의 경우에도 매우 느릴 수 있습니다. –

+0

@ Konrad Rudolph :이 코드는 OP가 요구 한 것과 정확히 일치합니다. 확실히 더 빠른 방법이 있지만 소스 코드를 다시 보면 10 개 항목의 버튼 처리기에서 성능이 중요하지 않음을 알 수 있습니다. 그래서 가장 많이 제공하는 \t 컬렉션에 개체가 들어 있는지 확인하는 방법. –

+0

예, 당신의 대답은 ** upvote **입니다. 내 의견은 downvote 이유가 아니라 "오, 그건 그렇고,"의미했다. –

관련 문제