Random is not thread safe, hopefully this will help

Code:
Public Class RandomWrap
    Inherits Random
    Private Shared lock As New Threading.AutoResetEvent(True)

    Public Overrides Function [Next]() As Integer
        RandomWrap.lock.WaitOne()
        Dim rv As Integer = MyBase.[Next]()
        RandomWrap.lock.Set()
        Return rv
    End Function

    Public Overrides Function [Next](maxValue As Integer) As Integer
        RandomWrap.lock.WaitOne()
        Dim rv As Integer = MyBase.[Next](maxValue)
        RandomWrap.lock.Set()
        Return rv
    End Function

    Public Overrides Function [Next](minValue As Integer, maxValue As Integer) As Integer
        RandomWrap.lock.WaitOne()
        Dim rv As Integer = MyBase.[Next](minValue, maxValue)
        RandomWrap.lock.Set()
        Return rv
    End Function

    Public Overrides Sub NextBytes(buffer() As Byte)
        RandomWrap.lock.WaitOne()
        MyBase.NextBytes(buffer)
        RandomWrap.lock.Set()
    End Sub

    Public Overrides Function NextDouble() As Double
        RandomWrap.lock.WaitOne()
        Dim rv As Double = MyBase.NextDouble()
        RandomWrap.lock.Set()
        Return rv
    End Function

    Protected Overrides Function Sample() As Double
        RandomWrap.lock.WaitOne()
        Dim rv As Double = MyBase.Sample
        RandomWrap.lock.Set()
        Return rv
    End Function
End Class