在VB.net中,我有一个生成随机字符串整数
的函数Public Function RandomString(ByVal Size As Integer, ByVal LowerBound As Double, ByVal Upperbound As Double) As list (of integer)
它有三个因子(size,lowerBound和upperBound)并在“LowerBound”和“UpperBound”之间随机生成一个长度为“size”的随机列表
在我的顶部代码中,我有:
Imports System.Random
功能的主体是这样的:
Dim rand As New Random
Dim mystr as new list (of integer)
for i as integer=1 to size
mystr.add(rand.Next(Upperbound - LowerBound + 1) + LowerBound)
next
return mystr
在我的子目录中,我有:
dim MyData(10) as list (of integer)
for i as integer = 0 to 9
mydata(i) = new list (of integer)
mydata(i) = RandomString(5,2,4)
next
奇怪的问题是,当我正常运行时,它会生成10个完全相同的字符串。
例如:
2,3,3,2,4
2,3,3,2,4
2,3,3,2,4
...
但是当我在循环中放置一个切换停止点(在我的子循环中)并且我逐步运行代码时,它正常工作并按预期生成不同的字符串。 比如
2,3,2,4,3
3,2,4,4,2
4,3,3,2,2
...
为什么会这样?我应该如何修改它才能在正常运行中正常工作?
答案 0 :(得分:2)
当您创建Random实例时,如果您未传递要使用的种子,它将使用与时间相关的默认种子。来自official documentation:
默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集。
这就是为什么在调试时得到“更随机”的结果 - 你在实例化之间给予更多时间。
所以要么use different seeds for each instance,要么在每次实例化之间人为地给予更多时间(即:Thread.Sleep
,但这是一个非常难看的黑客攻击。)
答案 1 :(得分:1)
问题在于,默认情况下,System.Random
会根据当前时间播种自身。如果您在很短的时间内创建了多个实例(例如循环),您将获得相同的种子,这将反过来创建相同的序列。
您可以通过制作随机实例Static
:
Public Function RandomString(ByVal Size As Integer, ByVal LowerBound As Double, ByVal Upperbound As Double) As List(of Integer)
' Static makes this instance get "preserved" across multiple calls to the method
' So it's only created once
Static rand As New Random
Dim mystr as new List(of Integer)
For i as integer=1 to size
mystr.add(rand.Next(Upperbound - LowerBound + 1) + LowerBound)
next
return mystr
End Function
这将导致在多个调用中使用相同的实例,这反过来将导致它不使用相同的种子重新种子。但是,如果从多个线程使用此方法,请注意这不是线程安全的。
答案 2 :(得分:1)
Static rand As New Random