Vb.net随机数生成器多次生成相同的数
我让这个程序从一个文件中生成名字和姓氏。当我运行这个程序时,我在三个文本框中输入信息。前两个是工资高低(salary1.text,salary2.text),最后一个是我想要的“份数”(copies.text)。。当我在文本框中输入10这样的数字时,它会输出一些相同的名称 firstname文件有大约100条记录 lastname文件有大约1000条记录 为什么它会生成相同的名称 如果我复印1000份,问题就更严重了。。它输出相同的东西8次,然后再做8次不同的事情Vb.net随机数生成器多次生成相同的数,vb.net,random,Vb.net,Random,我让这个程序从一个文件中生成名字和姓氏。当我运行这个程序时,我在三个文本框中输入信息。前两个是工资高低(salary1.text,salary2.text),最后一个是我想要的“份数”(copies.text)。。当我在文本框中输入10这样的数字时,它会输出一些相同的名称 firstname文件有大约100条记录 lastname文件有大约1000条记录 为什么它会生成相同的名称 如果我复印1000份,问题就更严重了。。它输出相同的东西8次,然后再做8次不同的事情 Public Class Fo
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
您每次都在使用一个新的
System.Random
实例<代码>随机按当前时间设定种子
使用与时间相关的默认种子值初始化Random类的新实例
由于您正在快速连续创建新实例,因此它们会得到相同的种子
相反,您应该使用相同的Random
,可能是将其设置为字段并初始化为字段初始值设定项或构造函数。例如:
Public Class Form1
Private _random As New System.Random()
'Use _random in other methods.
End Class
除了有人已经注意到的种子/定时问题外,如果随机数Mod 2=0,测试
对于这种类型的伪随机数生成器来说是一个非常糟糕的测试,因为较低的位比较高的位随机性小。“mod 2=0
”测试最低位,因此随机结果最少。进行掷硬币(50%)测试的更好方法是If RandomNumber>maxLimit/2
。您可能会发现这很有帮助。有了它,您可以使用staticRand.Current
实例,而不是每次都创建一个新的Random
,或者必须管理和传递一个Random
实例。关于Random类的MSDN文章有一个很好的例子,显示了两个返回相同数字序列的Random实例:
Public Class Form1
Private _random As New System.Random()
'Use _random in other methods.
End Class