not repeat a random number more then once?

phamster

New member
Joined
Feb 21, 2009
Messages
4
Programming Experience
1-3
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!
 
Create a list of numbers and remove from it every time you want a random:

VB.NET:
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
 
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\1heart.jpg")
cardArray(1) = Image.FromFile("C:\CardGame\CardGame\Resources\2heart.jpg")
cardArray(2) = Image.FromFile("C:\CardGame\CardGame\Resources\3heart.jpg")
cardArray(3) = Image.FromFile("C:\CardGame\CardGame\Resources\4heart.jpg")
cardArray(4) = Image.FromFile("C:\CardGame\CardGame\Resources\5heart.jpg")
cardArray(5) = Image.FromFile("C:\CardGame\CardGame\Resources\6heart.jpg")
cardArray(6) = Image.FromFile("C:\CardGame\CardGame\Resources\7heart.jpg")
cardArray(7) = Image.FromFile("C:\CardGame\CardGame\Resources\8heart.jpg")
cardArray(8) = Image.FromFile("C:\CardGame\CardGame\Resources\9heart.jpg")
cardArray(9) = Image.FromFile("C:\CardGame\CardGame\Resources\10heart.jpg")
cardArray(10) = Image.FromFile("C:\CardGame\CardGame\Resources\1diamond.jpg")
cardArray(11) = Image.FromFile("C:\CardGame\CardGame\Resources\2diamond.jpg")
cardArray(12) = Image.FromFile("C:\CardGame\CardGame\Resources\3diamond.jpg")
cardArray(13) = Image.FromFile("C:\CardGame\CardGame\Resources\4diamond.jpg")
cardArray(14) = Image.FromFile("C:\CardGame\CardGame\Resources\5diamond.jpg")
cardArray(15) = Image.FromFile("C:\CardGame\CardGame\Resources\6diamond.jpg")
cardArray(16) = Image.FromFile("C:\CardGame\CardGame\Resources\7diamond.jpg")
cardArray(17) = Image.FromFile("C:\CardGame\CardGame\Resources\8diamond.jpg")
cardArray(18) = Image.FromFile("C:\CardGame\CardGame\Resources\9diamond.jpg")
cardArray(19) = Image.FromFile("C:\CardGame\CardGame\Resources\10diamond.jpg")
cardArray(20) = Image.FromFile("C:\CardGame\CardGame\Resources\joker.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?
 
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.

VB.NET:
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.

VB.NET:
	Private Sub DealCards()
		Dim deck As New CardDeck

		Me.PicBoxComp1.Image = Image.FromFile(deck.GetRandomCard())
		Me.PicBoxUser1.Image = Image.FromFile(deck.GetRandomCard())
		'...
	End Sub
 
Back
Top