Results 1 to 7 of 7

Thread: not repeat a random number more then once?

  1. #1
    phamster is offline VB.NET Forum Newbie
    .NET Framework
    .NET 2.0 (VS 2005)
    Join Date
    Feb 2009
    Posts
    4
    Reputation
    0

    not repeat a random number more then once?

    Hello,

    I'm having trouble using the Random class. I have this code here:


    Dim myRandNum As Random = New Random(DateTime.Now.Millisecond)
    Dim i As Integer = 0

    i = Integer.Parse(myRandNum.Next(0, 21))


    I have this code in a function and everytime I call it it return a random number. The problem is I only want the number to be return/generate once. There be times I call the function and it returns the same number as in the pass. Is there a way to random the number once? I know in C++ you use like "Seed" or something and it will only generate once. Please help, Thanks!

  2. #2
    cjard's Avatar
    cjard is offline VB.NET Forum All-Mighty
    .NET Framework
    .NET 4.0
    Join Date
    Apr 2006
    Posts
    7,027
    Reputation
    1705
    Create a list of numbers and remove from it every time you want a random:

    Code:
    Class UniqueRandom
    
      Private nums as List(Of Integer)
      Private rng as New Random()
    
      Public Sub New(range as Integer)
        nums = new List(Of Integer)(range)
      
        For i as Integer = 0 to range - 1
          nums.Add(i)
        Next i
    
      End Sub
    
      Public Function GetRandomNumber() as Integer
        Dim ret as Integer, idx as Integer
     
        If nums.Count =0 Then Throw New Exception("No more nums available")
    
    
        idx = rng.Next(0, nums.Count)
        ret = nums(idx)
        nums.RemoveAt(idx)
        Return ret
      End Function

  3. #3
    phamster is offline VB.NET Forum Newbie
    .NET Framework
    .NET 2.0 (VS 2005)
    Join Date
    Feb 2009
    Posts
    4
    Reputation
    0
    How about sorting an array instead? How would I do that?

  4. #4
    cjard's Avatar
    cjard is offline VB.NET Forum All-Mighty
    .NET Framework
    .NET 4.0
    Join Date
    Apr 2006
    Posts
    7,027
    Reputation
    1705

  5. #5
    phamster is offline VB.NET Forum Newbie
    .NET Framework
    .NET 2.0 (VS 2005)
    Join Date
    Feb 2009
    Posts
    4
    Reputation
    0
    Ok, I try using the sorting array but no luck. Here is exactly what I'm trying to do. I have a card game that holds 21 cards from 1-10 hearts and diamonds only and one joker. Here's my code:

    Dim cardArray(20) As Image
    Dim myRandNum As Random = New Random(DateTime.Now.Millisecond)

    Private Sub main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    cardArray(0) = Image.FromFile("C:\CardGame\CardGame\Resources\1he art.jpg")
    cardArray(1) = Image.FromFile("C:\CardGame\CardGame\Resources\2he art.jpg")
    cardArray(2) = Image.FromFile("C:\CardGame\CardGame\Resources\3he art.jpg")
    cardArray(3) = Image.FromFile("C:\CardGame\CardGame\Resources\4he art.jpg")
    cardArray(4) = Image.FromFile("C:\CardGame\CardGame\Resources\5he art.jpg")
    cardArray(5) = Image.FromFile("C:\CardGame\CardGame\Resources\6he art.jpg")
    cardArray(6) = Image.FromFile("C:\CardGame\CardGame\Resources\7he art.jpg")
    cardArray(7) = Image.FromFile("C:\CardGame\CardGame\Resources\8he art.jpg")
    cardArray(8) = Image.FromFile("C:\CardGame\CardGame\Resources\9he art.jpg")
    cardArray(9) = Image.FromFile("C:\CardGame\CardGame\Resources\10h eart.jpg")
    cardArray(10) = Image.FromFile("C:\CardGame\CardGame\Resources\1di amond.jpg")
    cardArray(11) = Image.FromFile("C:\CardGame\CardGame\Resources\2di amond.jpg")
    cardArray(12) = Image.FromFile("C:\CardGame\CardGame\Resources\3di amond.jpg")
    cardArray(13) = Image.FromFile("C:\CardGame\CardGame\Resources\4di amond.jpg")
    cardArray(14) = Image.FromFile("C:\CardGame\CardGame\Resources\5di amond.jpg")
    cardArray(15) = Image.FromFile("C:\CardGame\CardGame\Resources\6di amond.jpg")
    cardArray(16) = Image.FromFile("C:\CardGame\CardGame\Resources\7di amond.jpg")
    cardArray(17) = Image.FromFile("C:\CardGame\CardGame\Resources\8di amond.jpg")
    cardArray(18) = Image.FromFile("C:\CardGame\CardGame\Resources\9di amond.jpg")
    cardArray(19) = Image.FromFile("C:\CardGame\CardGame\Resources\10d iamond.jpg")
    cardArray(20) = Image.FromFile("C:\CardGame\CardGame\Resources\jok er.jpg")
    End Sub

    Private Sub btnBet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBet.Click
    dealCards()
    End Sub

    Private Sub dealCards()
    picBoxComp1.Image = cardArray(getCard())
    picBoxUser1.Image = cardArray(getCard())
    picBoxComp2.Image = cardArray(getCard())
    picBoxUser2.Image = cardArray(getCard())
    picBoxComp3.Image = cardArray(getCard())
    picBoxUser3.Image = cardArray(getCard())
    End Sub

    Function getCard()
    Return Integer.Parse(myRandNum.Next(20))
    End Function


    Is there a better way to randomize the cards?

  6. #6
    MattP is offline VB.NET Forum All-Mighty
    .NET Framework
    .NET 4.0
    Join Date
    Feb 2008
    Location
    WY, USA
    Posts
    1,206
    Reputation
    571
    cjard was trying to get you to create a class similar to this one. The class contains a New() Sub that generates your deck. It also contains a GetRandomX function that returns a random 'card' and removes it from the List so you can't select it again.

    Code:
    Friend Class CardDeck
    	Private allCardsList As List(Of String)
    	Private Shared rand As New Random()
    
    	Public Sub New()
    		allCardsList = New List(Of String)(20)
    
    		With allCardsList
    			.Add("C:\CardGame\CardGame\Resources\1heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\2heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\3heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\4heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\5heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\6heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\7heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\8heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\9heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\10heart.jpg")
    			.Add("C:\CardGame\CardGame\Resources\1diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\2diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\3diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\4diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\5diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\6diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\7diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\8diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\9diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\10diamond.jpg")
    			.Add("C:\CardGame\CardGame\Resources\joker.jpg")
    		End With
    	End Sub
    
    	Public Function GetRandomCard() As String
    		Dim idx As Integer
    		Dim card As String = Nothing
    
    		If allCardsList.Count <> 0 Then
    			idx = rand.Next(0, allCardsList.Count)
    			card = allCardsList(idx)
    			allCardsList.RemoveAt(idx)
    		Else
    			Throw New Exception("No cards left in deck")
    		End If
    
    		Return card
    	End Function
    
    End Clas
    Once you've got that set up you can instantiate a new instance of the class and start dealing cards. I would suggest that you store your complete deck as the paths to your images and only load them when you're going to use them.

    Code:
    	Private Sub DealCards()
    		Dim deck As New CardDeck
    
    		Me.PicBoxComp1.Image = Image.FromFile(deck.GetRandomCard())
    		Me.PicBoxUser1.Image = Image.FromFile(deck.GetRandomCard())
    		'...
    	End Sub

  7. #7
    phamster is offline VB.NET Forum Newbie
    .NET Framework
    .NET 2.0 (VS 2005)
    Join Date
    Feb 2009
    Posts
    4
    Reputation
    0
    Thank you so much! it works now!

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Harvest time tracking