【发布时间】:2016-12-17 21:15:49
【问题描述】:
我需要一个用于 2D Monte Carlo 模拟的伪随机数生成器,它不具备使用简单 LCG 获得的特征超平面。我使用以下代码在 Excel 2013 中测试了随机数生成器 Rnd()(运行大约需要 5 秒):
Sub ZoomRNG()
Randomize
For i = 1 To 1000
Found = False
Do
x = Rnd() ' 2 random numbers between 0.0 and 1.0
y = Rnd()
If ((x > 0.5) And (x < 0.51)) Then
If ((y > 0.5) And (y < 0.51)) Then
' Write if both x & y in a narrow range
Cells(i, 1) = i
Cells(i, 2) = x
Cells(i, 3) = y
Found = True
End If
End If
Loop While (Not Found)
Next i
End Sub
这是运行上述代码后 x 与 y 的简单图
它不仅看起来不是很随机,而且比臭名昭著的 RANDU 算法在 2D 中具有更明显的超平面。基本上,我是否错误地使用了该函数,或者 VBA 中的 Rnd() 函数实际上一点也不可用?
作为比较,这是我在 C++ 中使用 Mersenne Twister MT19937 得到的结果。
【问题讨论】:
-
Randomize函数接受一个参数,例如Randomize Now()但实际上似乎对你的情节没有影响
标签: excel random excel-2013 montecarlo vba