Vb.net random number generator generates the same number many times

I have this program that generates a first and last name from a file. When I run this program, I enter information in three text fields. The first two are low and high salaries (salary1.text, zary2.2.text), and the last is the number of โ€œcopiesโ€ (copy.text) that I want. When I put a number in the text, such as 10 in the text box, it displays some of the same names.

The firstname file contains about 100 entries and the lastname file has about 1000 entries

Why does it generate the same name

The problem is even worse if I do something like 1000 instances .. it outputs the same thing 8 times and then does something else again 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 

Example output with 10 entries

 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 
+4
source share
1 answer

Each time you use a new instance of System.Random . Random seeded by the current time.

Initializes a new instance of the Random class using a temporary initial default value.

Link

Since you create new instances in a very fast sequence, they get the same seed.

Instead, you should use the same instance of Random , perhaps by making it a field and initializing as a field initializer or constructor. For instance:

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

All Articles