Vb.net Random Number generator generating same num

2020-01-24 16:57发布

问题:

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
            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

回答1:

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


标签: vb.net random