Vb.net 梅森捻线器-超出范围异常
在Mersenne Twister的VB.NET实现中,我得到了一个超出范围的异常,它会定期抛出(下面的错误图像截图):Vb.net 梅森捻线器-超出范围异常,vb.net,exception,mersenne-twister,Vb.net,Exception,Mersenne Twister,在Mersenne Twister的VB.NET实现中,我得到了一个超出范围的异常,它会定期抛出(下面的错误图像截图): 是否有某种种子和它窒息的迭代?这看起来有点像我的实现(它的输出与其他两个实现的输出相匹配),但有一些区别。我使用init_数组,所以这不是一个随机种子吗?我没有看过整数种子(?)你用什么作为源?末端的回火部分不同于初始genrand64中的5489UL,它是默认种子,但您可以使用其他种子。对于一个给定的种子,还有数千个MT值的列表(在某处),你可以用来验证你的实现-是吗?还有
是否有某种种子和它窒息的迭代?这看起来有点像我的实现(它的输出与其他两个实现的输出相匹配),但有一些区别。我使用init_数组,所以这不是一个随机种子吗?我没有看过整数种子(?)你用什么作为源?末端的回火部分不同于初始genrand64中的
5489UL
,它是默认种子,但您可以使用其他种子。对于一个给定的种子,还有数千个MT值的列表(在某处),你可以用来验证你的实现-是吗?还有一个NuGet包:MathNet,其中包括MT。有一个bug,但我报告了它,他们确实修复了它-奇怪的是,我试图用他们的来验证我的。如果NuGet包不在VB.NET中,那么它将超出我快速实现的需要。我可以快速从C++和C语言转换为VB.NET,但是你从来没有作者的保证它工作。有一个种子和迭代它窒息?这看起来有点像我的实现(它的输出与其他两个实现的输出相匹配),但有一些区别。我使用init_数组,所以这不是一个随机种子吗?我没有看过整数种子(?)你用什么作为源?末端的回火部分不同于初始genrand64中的5489UL
,它是默认种子,但您可以使用其他种子。对于一个给定的种子,还有数千个MT值的列表(在某处),你可以用来验证你的实现-是吗?还有一个NuGet包:MathNet,其中包括MT。有一个bug,但我报告了它,他们确实修复了它-奇怪的是,我试图用他们的来验证我的。如果NuGet包不在VB.NET中,那么它将超出我快速实现的需要。我可以快速地从C++和C语言转换为VB.NET,但是你永远没有作者的保证。
Private Shared mt(312 - 1) As ULong
Private Shared mti As ULong = 312 + 1
Private Function genrand64_int64() As ULong
On Error GoTo errhandler
Dim i As Long
Dim x As ULong
Static mag01() As ULong = {0UL, MATRIX_A}
If mti >= NN Then ' generate NN words at one time
' if init_genrand64() has not been called,
' a default initial seed is used
If mti = NN + 1 Then
init_genrand64(5489UL)
End If
i = 0
Do While i < NN - MM
x = (mt(i) And UM) Or (mt(i + 1) And LM)
mt(i) = mt(i + MM) Xor (x >> 1) Xor mag01(CInt(x And 1UL))
i += 1
Loop
Do While i < NN - 1
x = (mt(i) And UM) Or (mt(i + 1) And LM)
mt(i) = mt(i + (MM - NN)) Xor (x >> 1) Xor mag01(CInt(x And 1UL))
i += 1
Loop
x = (mt(NN - 1) And UM) Or (mt(0) And LM)
mt(NN - 1) = mt(MM - 1) Xor (x >> 1) Xor mag01(CInt(x And 1UL))
mti = 0
End If
x = mt(mti) '<<<<<<<<<<<HERE<<<<<<<<<<<<<<<<<<<<<<
mti += 1
x = x Xor (x >> 29) And &H5555555555555555UL
x = x Xor (x << 17) And &H71D67FFFEDA60000UL
x = x Xor (x << 37) And &HFFF7EEE000000000UL
x = x Xor (x >> 43)
Return x
End Function
Sub init_genrand64(ByVal seed As ULong)
mt(0) = seed
For mti = 1 To NN - 1
mt(mti) = (6364136223846793005UL * (mt(mti - 1) Xor (mt(mti - 1) >> 62)) + mti)
Next mti
End Sub