Generador de números aleatorios de Vb.net que genera el mismo número muchas veces

Tengo este progtwig generando un nombre y apellido de un archivo. Cuando ejecuto este progtwig, ingreso información en tres cuadros de texto. Los primeros dos son el salario bajo y alto (salary1.text, salary2.text) y el último es el número de “copias” (copies.text) que quiero. Cuando coloco un número como 10 en el texto caja emite algunos de los mismos nombres.

El archivo firstname tiene alrededor de 100 registros y el archivo lastname tiene aproximadamente 1000 registros

¿Por qué está generando el mismo nombre?

El problema es aún peor si hago algo así como 1000 copias … produce el mismo resultado 8 veces y luego hace algo diferente otras 8 veces

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 

Muestra de salida con 10 registros

 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 

Está utilizando una nueva instancia de System.Random todo el tiempo. Random es sembrado por la hora actual.

Inicializa una nueva instancia de la clase Aleatoria, utilizando un valor de inicialización predeterminado dependiente del tiempo

Referencia

Como está creando nuevas instancias en una sucesión muy rápida, obtienen la misma semilla.

En su lugar, debe usar la misma instancia de Random , posiblemente convirtiéndolo en un campo e inicializándose como un inicializador de campo o constructor. Por ejemplo:

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