Vb.net随机数发生器多次生成相同的数字

我有这个程序从一个文件生成一个名字和姓氏。 当我运行这个程序时,我在三个文本框中input信息。 前两个是薪水低和高(salary1.text,salary2.text),最后一个是我想要的“副本”(copies.text)的数量。当我把一个数字如10它会输出一些相同的名字。

firstname文件有大约100条logging,lastname文件有大约1000条logging

为什么它生成相同的名称

如果我做1000份拷贝,问题就更糟了。它输出8次相同的东西,然后再做8次不同的东西

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 

带有10条logging的示例输出

 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 

您每次都使用System.Random的新实例。 Random播种当前时间。

使用时间相关的默认种子值初始化Random类的新实例

参考

由于您正在快速连续创build新实例,因此它们会获得相同的种子。

相反,您应该使用Random的相同实例,可能是将其作为字段初始化为字段初始值设定项或构造函数。 例如:

 Public Class Form1 Private _random As New System.Random() 'Use _random in other methods. End Class