This may be a bit tricky; I’ll try to explain what I am trying to do and hope that there is a way to do it with some code I can use in VB.NET 2002. For this part of my program I need to take a number of known numbers then mix them with random numbers in a range to make a set of numbers in a specific format.
The number of known numbers is unknown: Example…there may be 1 known number, 3 known numbers or 10 known numbers…. I think something like having some type of input to add the known numbers to an array and then randomly pick the rest of the needed numbers from a range that the user sets and then randomly mix them all up and display them in a label or something best explains what it is I am looking for.
3 known numbers, needs to have total of 6 numbers, enter the 3 known numbers and they are added to an array, set the range of numbers 0 to 40 and have the program pick 3 numbers that are then added to the array, the numbers are randomly mixed together and then displayed in double digit format for numbers 0 to 9 so that 1 is 01 etc…. the label display might look like this: 08 – 25 – 14 – 07 – 06 – 34
Anyone have a working example of how this can be done?
Almost.... the user will have some number of numbers they already know and the rest they will need random numbers for.
Example:
I need the user to enter the numbers they already have (not everyone will have the same amount of numbers) once they enter what they have already I need the program to take a pre defined (by the user) range of numbers that it will pick the rest of the numbers from, it will take what the user entered and what it calculated (randomly on it's own) then randomly mix all the numbers again and display the set of numbers.
Still example:
Say a user knows that the range of numbers is between 0 and 54, they only need to have 6 numbers in all, they already know they have number 4, 20, and 32 but they still need to have the program come up with the other three numbers randomly to make them then have the 6 numbers. The program will pick the other 3 numbers from the user set range of 0 and 54, the program say picks 18, 50, and 7... now they have 4, 20, 32, 18, 50, 7 as their 6 numbers. The program then needs to take those numbers and mix their order up and then display the 6 numbers in a format like 18 - 7 - 4 - 20 - 50 - 32 to the user.
Mike TomlinsonMiddle School Assistant TeacherCommented:
The following function getNumbers() should do the trick:
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim knownValues() As Integer = {4, 20, 32}
Label1.Text = getNumbers(knownValues, 6, 0, 54)
End Sub
Private Function getNumbers(ByVal known() As Integer, ByVal requiredNumber As Integer, _
ByVal minRange As Integer, ByVal maxRange As Integer) As String
Dim output As String
Dim i As Integer
Dim tmp As Integer
Dim rndIndex As Integer
Dim tmpArray(requiredNumber - 1) As Integer
Dim r As New Random
Dim randomPool As New ArrayList
' build the random pool
For i = minRange To maxRange
' don't include any of the known values
If Array.IndexOf(known, i) = -1 Then
randomPool.Add(i)
End If
Next
' shuffle the random values
For i = 0 To (randomPool.Count - 1)
rndIndex = r.Next(0, randomPool.Count)
tmp = randomPool(i)
randomPool(i) = randomPool(rndIndex)
randomPool(rndIndex) = tmp
Next
' populate tmpArray with the known values
' and fill in any remaining slots
' with values from the shuffled randomPool
For i = 0 To (requiredNumber - 1)
If i <= known.GetUpperBound(0) Then
tmpArray(i) = known(i)
Else
tmpArray(i) = randomPool.Item(0)
randomPool.RemoveAt(0)
End If
Next
' shuffle the set by swapping
' each position with another
For i = 0 To tmpArray.GetUpperBound(0)
rndIndex = r.Next(0, tmpArray.GetUpperBound(0))
tmp = tmpArray(i)
tmpArray(i) = tmpArray(rndIndex)
tmpArray(rndIndex) = tmp
Next
' build the output string from
' the shuffled set
For i = 0 To tmpArray.GetUpperBound(0)
If output = "" Then
output = Format(tmpArray(i), "00")
Else
output = output & " - " & Format(tmpArray(i), "00")
End If
Next
Return output
End Function
End Class
0
Your question, your audience. Choose who sees your identity—and your question—with question security.
That got me thinking...... I know how to better explain now. The user is given a piece of paper that has some numbers on it.... it may have just one number or any amount of numbers on it, the paper also has a range of numbers on it that could be anything and it has how many numbers you need in total, the user don't know what any of these are till they get their piece of paper. They need to enter the range of numbers that is on the paper with two NumericUpDown controls and they have to enter the number of numbers total they need with a textbox and they need to enter the numbers one at a time with another textbox to add to the pool and then push a button. The program will know how many numbers they need total and the range of numbers it needs to pick the rest from to make the total amount of numbers they entered, it takes what they have entered plus what it picks from the pool and combines them in a random order and displays them on a label.
It's kinda like you know some of the numbers you want/need but you want the rest of the unknown numbers to be randomly picked from a pool or range of numbers then have them mixed up and displayed so they aren't in any order from the ones you knew and the ones the program picked for you.
hope i'm not asking the obvious but... how many numbers are ever needed in total? e.g. you mentioned that with three known numbers that another three are needed for a total of six, how many for n known numbers?
Mike TomlinsonMiddle School Assistant TeacherCommented:
Hi teamdad, the algorithm I posted will work for your requirements. Do you need help putting an interface on it?
~IM
0
teamdadAuthor Commented:
Babycorn-Starfish, it's another tricky part. The most would be 6 total but the user may have one of the six, two of the six, three of the six, four of the six or five of the six numbers.
Idle Mind, in your code I saw that it hard coded the numbers and the known numbers will not be the same every time. Another working example would be great if it will still work.
Mike TomlinsonMiddle School Assistant TeacherCommented:
The numbers were hard coded into an array only for the example.
The getNumbers() function itself receives an array of integers so it is flexible. Just build the array of values as the user enters them and pass them into the function along with the other parameters.
Do I need to build an entire GUI to show how to use it?
~IM
0
teamdadAuthor Commented:
If you wouldn't mind, I would like an example to see how it works. I only put a label and a button on the GUI I made for it.
Mike TomlinsonMiddle School Assistant TeacherCommented:
Here is an example of the function being used via a GUI. There isn't any error checking present. This is simply an example of one way to use it.
~IM
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents requiredNumber As System.Windows.Forms.NumericUpDown
Friend WithEvents minRange As System.Windows.Forms.NumericUpDown
Friend WithEvents maxRange As System.Windows.Forms.NumericUpDown
Friend WithEvents addKnownValue As System.Windows.Forms.Button
Friend WithEvents Label2 As System.Windows.Forms.Label
Friend WithEvents Label3 As System.Windows.Forms.Label
Friend WithEvents Label4 As System.Windows.Forms.Label
Friend WithEvents knownValue As System.Windows.Forms.NumericUpDown
Friend WithEvents reset As System.Windows.Forms.Button
Friend WithEvents knownValuesList As System.Windows.Forms.ListBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Label1 = New System.Windows.Forms.Label
Me.Button1 = New System.Windows.Forms.Button
Me.addKnownValue = New System.Windows.Forms.Button
Me.requiredNumber = New System.Windows.Forms.NumericUpDown
Me.minRange = New System.Windows.Forms.NumericUpDown
Me.maxRange = New System.Windows.Forms.NumericUpDown
Me.Label2 = New System.Windows.Forms.Label
Me.Label3 = New System.Windows.Forms.Label
Me.Label4 = New System.Windows.Forms.Label
Me.knownValue = New System.Windows.Forms.NumericUpDown
Me.reset = New System.Windows.Forms.Button
Me.knownValuesList = New System.Windows.Forms.ListBox
CType(Me.requiredNumber, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.minRange, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.maxRange, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.knownValue, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(16, 120)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(232, 32)
Me.Label1.TabIndex = 0
Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(256, 120)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(104, 24)
Me.Button1.TabIndex = 1
Me.Button1.Text = "Generate Set"
'
'addKnownValue
'
Me.addKnownValue.Location = New System.Drawing.Point(208, 16)
Me.addKnownValue.Name = "addKnownValue"
Me.addKnownValue.Size = New System.Drawing.Size(72, 24)
Me.addKnownValue.TabIndex = 3
Me.addKnownValue.Text = "Add Known"
'
'requiredNumber
'
Me.requiredNumber.Location = New System.Drawing.Point(72, 16)
Me.requiredNumber.Name = "requiredNumber"
Me.requiredNumber.Size = New System.Drawing.Size(48, 20)
Me.requiredNumber.TabIndex = 4
Me.requiredNumber.Value = New Decimal(New Integer() {6, 0, 0, 0})
'
'minRange
'
Me.minRange.Location = New System.Drawing.Point(72, 48)
Me.minRange.Name = "minRange"
Me.minRange.Size = New System.Drawing.Size(48, 20)
Me.minRange.TabIndex = 5
'
'maxRange
'
Me.maxRange.Location = New System.Drawing.Point(72, 80)
Me.maxRange.Name = "maxRange"
Me.maxRange.Size = New System.Drawing.Size(48, 20)
Me.maxRange.TabIndex = 6
Me.maxRange.Value = New Decimal(New Integer() {54, 0, 0, 0})
'
'Label2
'
Me.Label2.Location = New System.Drawing.Point(8, 48)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(56, 16)
Me.Label2.TabIndex = 7
Me.Label2.Text = "Minimum:"
Me.Label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight
'
'Label3
'
Me.Label3.Location = New System.Drawing.Point(8, 80)
Me.Label3.Name = "Label3"
Me.Label3.Size = New System.Drawing.Size(56, 16)
Me.Label3.TabIndex = 8
Me.Label3.Text = "Maximum:"
Me.Label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight
'
'Label4
'
Me.Label4.Location = New System.Drawing.Point(8, 16)
Me.Label4.Name = "Label4"
Me.Label4.Size = New System.Drawing.Size(56, 16)
Me.Label4.TabIndex = 9
Me.Label4.Text = "Required:"
Me.Label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight
'
'knownValue
'
Me.knownValue.Location = New System.Drawing.Point(152, 16)
Me.knownValue.Name = "knownValue"
Me.knownValue.Size = New System.Drawing.Size(48, 20)
Me.knownValue.TabIndex = 10
'
'reset
'
Me.reset.Location = New System.Drawing.Point(288, 16)
Me.reset.Name = "reset"
Me.reset.Size = New System.Drawing.Size(72, 24)
Me.reset.TabIndex = 11
Me.reset.Text = "Reset"
'
'knownValuesList
'
Me.knownValuesList.Location = New System.Drawing.Point(152, 48)
Me.knownValuesList.Name = "knownValuesList"
Me.knownValuesList.Size = New System.Drawing.Size(208, 56)
Me.knownValuesList.TabIndex = 12
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(368, 158)
Me.Controls.Add(Me.knownValuesList)
Me.Controls.Add(Me.reset)
Me.Controls.Add(Me.knownValue)
Me.Controls.Add(Me.Label4)
Me.Controls.Add(Me.Label3)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.maxRange)
Me.Controls.Add(Me.minRange)
Me.Controls.Add(Me.requiredNumber)
Me.Controls.Add(Me.addKnownValue)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.Label1)
Me.Name = "Form1"
Me.Text = "Partial Random Set"
CType(Me.requiredNumber, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.minRange, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.maxRange, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.knownValue, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
Private knownValues As New ArrayList
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = getNumbers(knownValues, requiredNumber.Value, minRange.Value, maxRange.Value)
End Sub
Private Function getNumbers(ByVal known As ArrayList, ByVal requiredNumber As Integer, _
ByVal minRange As Integer, ByVal maxRange As Integer) As String
Dim output As String
Dim i As Integer
Dim tmp As Integer
Dim rndIndex As Integer
Dim tmpArray(requiredNumber - 1) As Integer
Dim r As New Random
Dim randomPool As New ArrayList
' build the random pool
For i = minRange To maxRange
' don't include any of the known values
If Not known.Contains(i) Then
randomPool.Add(i)
End If
Next
' shuffle the random values
For i = 0 To (randomPool.Count - 1)
rndIndex = r.Next(0, randomPool.Count)
tmp = randomPool(i)
randomPool(i) = randomPool(rndIndex)
randomPool(rndIndex) = tmp
Next
' populate tmpArray with the known values
' and fill in any remaining slots
' with values from the shuffled randomPool
For i = 0 To (requiredNumber - 1)
If i <= (known.Count - 1) Then
tmpArray(i) = known(i)
Else
tmpArray(i) = randomPool.Item(0)
randomPool.RemoveAt(0)
End If
Next
' shuffle the set by swapping
' each position with another
For i = 0 To tmpArray.GetUpperBound(0)
rndIndex = r.Next(0, tmpArray.GetUpperBound(0))
tmp = tmpArray(i)
tmpArray(i) = tmpArray(rndIndex)
tmpArray(rndIndex) = tmp
Next
' build the output string from
' the shuffled set
For i = 0 To tmpArray.GetUpperBound(0)
If output = "" Then
output = Format(tmpArray(i), "00")
Else
output = output & " - " & Format(tmpArray(i), "00")
End If
Next
Return output
End Function
Private Sub reset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles reset.Click
knownValues = New ArrayList
knownValuesList.Items.Clear()
Label1.Text = ""
End Sub
Private Sub addKnownValue_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles addKnownValue.Click
knownValues.Add(knownValue.Value)
knownValuesList.Items.Add(knownValue.Value)
End Sub
End Class
0
Question has a verified solution.
Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.
MsgBox(rnd.Next(CInt(Me.Te