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

use*_*621 5 vb.net random

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

firstname文件有大约100条记录,lastname文件大约有1000条记录

为什么它生成相同的名称

如果我做了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
Run Code Online (Sandbox Code Playgroud)

样本输出有10条记录

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
Run Code Online (Sandbox Code Playgroud)

vcs*_*nes 20

System.Random每次都在使用一个新实例.Random是按当前时间播种的.

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

参考

由于您要快速连续创建新实例,因此它们会获得相同的种子.

相反,您应该使用相同的实例Random,可能使其成为一个字段并初始化为字段初始值设定项或构造函数.例如:

Public Class Form1
    Private _random As New System.Random()

    'Use _random in other methods.
End Class
Run Code Online (Sandbox Code Playgroud)