VB.Net中的随机化

时间:2013-08-14 20:03:25

标签: vb.net

在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
...

为什么会这样?我应该如何修改它才能在正常运行中正常工作?

3 个答案:

答案 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)

<@> @ Renan的回答是正确的。您还可以执行以下操作,该变量仅初始化变量一次,但应在多次调用期间为您提供唯一性。

Static rand As New Random