2

Hello I 5 unique numbers betwen 0 and 10, I'm doing as following :

Dim RandomClass As New Random()
Dim RandomNumber As Integer
For counter As Integer = 0 To 5
    RandomNumber = RandomClass.Next(0, 10)
    MsgBox(RandomNumber )
Next

Sometimes it works, I get those numbers : "1,7,4,9,3" but sometimes I get a duplicate numbers like : "5,2,3,2,7"

How can I be sure to have unique numbers each time?

Thank you.

OussamaLord
  • 1,073
  • 5
  • 28
  • 39

4 Answers4

6

Use HashSet(Of Integer) to remember numbers that have already been printed out:

Dim RandomClass As New Random()
Dim RememberSet As New HashSet(Of Integer)

Dim RandomNumber As Integer

While RememberSet.Count < 5
    RandomNumber = RandomClass.Next(0, 10)
    If RememberSet.Add(RandomNumber) Then
        MsgBox(RandomNumber)
    End If
End While
Karl Anderson
  • 34,606
  • 12
  • 65
  • 80
MarcinJuraszek
  • 124,003
  • 15
  • 196
  • 263
2

Just for fun, a different approach, make a list of integers from 0 to 10, use the random generator to get an index inside this list, print that number and remove from the list. Keep the generation of the random numbers inside the limits

Dim numbers = Enumerable.Range(0, 11).ToList()
Dim RandomClass As New Random()
Dim RandomIndex As Integer
For counter As Integer = 1 To 5
    RandomIndex = RandomClass.Next(0, numbers.Count)
    MsgBox(numbers(RandomIndex))
    numbers.RemoveAt(RandomIndex)
Next
dbasnett
  • 11,334
  • 2
  • 25
  • 33
Steve
  • 213,761
  • 22
  • 232
  • 286
  • 1
    To make this clearer 10 - counter could be replaced with numbers.Count. – dbasnett Aug 17 '13 at 22:17
  • Oh yes, it is better, also Enumerable.Range is shorter – Steve Aug 17 '13 at 22:20
  • @dbasnett thanks for the fix, however there are still uncertainties like if the number 10 should be enclosed or not in the possible outputs. The OP should explain better, but now has already made ​​his choice... – Steve Aug 17 '13 at 23:04
  • agreed. Their choice was not one that will scale well. – dbasnett Aug 18 '13 at 00:28
  • You could also do `var numbers = Enumerable.Range(0, 11).OrderBy(n => RandomClass.Next()).Take(5)` although it's probably not as efficient. – Chris Dunaway Aug 19 '13 at 14:02
0

I would suggest adding a seed so that random numbers are not repeated.

Dim RandomClass As New Random(DateTime.Now.Ticks)
Dim RememberSet As New HashSet(Of Integer)

Dim RandomNumber As Integer

While RememberSet.Count < 5
    RandomNumber = RandomClass.Next(0, 10)
    If RememberSet.Add(RandomNumber) Then
        MsgBox(RandomNumber)
    End If
End While
RossGamble
  • 16
  • 1
0

try following:

 Sub Main()

    Dim a As String() = New String(2) {}
    Dim b As String
    Dim c As Integer = 0
    Dim d As String = " "
    Do
        Console.Clear()
        Console.Write("Enter your name:")
        a(c) = Console.ReadLine()
        c += 1

    Loop Until c = 3
    For Each d In a
        Console.Write(" " & d)
    Next
    Console.ReadLine()
Prasad Jadhav
  • 5,090
  • 16
  • 62
  • 80
Swalla
  • 1