Vb.net Random Number generator generating same number many times
I have this program generating a firstname and lastname from a file. When I run this program I enter information in three textboxes. The first two are the salary low and high(salary1.text, salary2.text) and the last one is the number of "copies"(copies.text) that I want.. When I put a number such as 10 in the text box it outputs some of the same names.
The firstname file has around 100 records and the lastname file has about 1000 records
Why is it generating the same name
The problem is even worse if I do something like 1000 copies.. it outputs the same thing 8 times and then does something different another 8 times
Public Class Form1
Dim sex As String
Function randomfirstname()
Dim infile As IO.StreamReader
Dim infile1 As IO.StreamReader
Dim male() As String
Dim female() As String
Dim name As String
Dim n As Integer = 0
Dim fun As New System.Random
Dim maleorfemale As New Random()
Dim RandomNumber As Integer
Dim index As Integer
RandomNumber = maleorfemale.Next(0, 55984)
infile = IO.File.OpenText("boysnames.txt")
infile1 = IO.File.OpenText("girlsnames.txt")
If RandomNumber Mod 2 = 0 Then
While infile.Peek <> -1
ReDim Preserve male(n)
male(n) = infile.ReadLine开发者_JAVA技巧
n = n + 1
End While
n = n - 1
index = fun.Next(0, n)
name = male(index)
sex = "M"
n = 0
Return name
Else
While infile1.Peek <> -1
ReDim Preserve female(n)
female(n) = infile1.ReadLine
n = n + 1
End While
n = n - 1
index = fun.Next(0, n)
name = female(index)
sex = "F"
Return name
n = 0
End If
End Function
Function randomlastname()
Dim infile2 As IO.StreamReader
Dim lname() As String
Dim lastname As String
Dim n As Integer = 0
Dim index As Integer
Dim fun As New System.Random
infile2 = IO.File.OpenText("lastname.txt")
While infile2.Peek <> -1
ReDim Preserve lname(n)
lname(n) = infile2.ReadLine
n = n + 1
End While
n = n - 1
index = fun.Next(0, n)
lastname = lname(index)
Return lastname
End Function
Function salary()
Dim salary01 As Double
Dim salary02 As Double
Dim salary03 As Double
salary01 = CDbl(salary1.Text)
salary02 = CDbl(salary2.Text)
Dim sal As New System.Random
salary03 = System.Math.Round(sal.NextDouble() * (salary02 - salary01) + salary01, 2)
Return salary03
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'ListBox1.Items.Add(randomfirstname() & vbTab & randomlastname() & vbTab & sex & vbTab & salary())
Dim outfile As New System.IO.StreamWriter("C:\Users\Johnathon\Desktop\486assign1.txt")
Dim i As Integer = 0
outfile.Write("Firstname" & vbTab & "LastName" & vbTab & "Sex" & vbTab & "Salary" & vbCrLf)
outfile.Write("-----------------------------------------------------------------------------" & vbCrLf)
For i = 1 To CInt(copies.Text)
outfile.Write(randomfirstname() & vbTab & randomlastname() & vbTab & sex & vbTab & salary() & vbCrLf)
ListBox1.Items.Add(randomfirstname() & vbTab & randomlastname() & vbTab & sex & vbTab & salary())
Next
outfile.Close()
End Sub
End Class
Sample Output with 10 records
Firstname LastName Sex Salary
-----------------------------------------------------------------------------
Carson Gillespie M 8.46
Carson Gillespie M 8.46
Carson Gillespie M 8.46
Samantha Daniels F 5.84
Samantha Daniels F 5.84
Samantha Daniels F 5.84
Natalia Guthrie F 9.26
Natalia Guthrie F 9.26
Natalia Guthrie F 9.26
Natalia Guthrie F 6.64
You're using a new instance of System.Random
every time. Random
is seeded by the current time.
Initializes a new instance of the Random class, using a time-dependent default seed value
Reference
Since you are creating new instances in very quick succession, they get the same seed.
Instead, you should use the same instance of Random
, possibly by making it a field and initializing as a field initializer or constructor. For example:
Public Class Form1
Private _random As New System.Random()
'Use _random in other methods.
End Class
精彩评论