我正在Excel中运行蒙特卡罗模拟。为了表示每个产品SKU在每个月的需求分布,我使用以下公式500多次:
=IFERROR(BETA.INV(RAND(),(1+4*(D35-D31)/(D27-D31)),(1+4*(D27-D35)/(D27-D31)),D31,D27),0)
所以,这是一次性使用超过500个RAND()
非稳定函数。
每个公式迭代的输出存储在一个表中。我有一个VBA来处理它:
Sub QARLO_Products()
'runs on QARLO_P!, for forecasting product
Range("Q7:OC100000").ClearContents
For Iteration = 1 To Range("G1").Value
Range("I1").Value = Range("G1").Value - Iteration
'For QMIN Zinc-Bulk
Cells(6 + Iteration, 17) = Iteration
Cells(6 + Iteration, 18) = Cells(39, 4)
Cells(6 + Iteration, 19) = Cells(39, 5)
Cells(6 + Iteration, 20) = Cells(39, 6)
Cells(6 + Iteration, 21) = Cells(39, 7)
Cells(6 + Iteration, 22) = Cells(39, 8)
Cells(6 + Iteration, 23) = Cells(39, 9)
Cells(6 + Iteration, 24) = Cells(39, 10)
Cells(6 + Iteration, 25) = Cells(39, 11)
Cells(6 + Iteration, 26) = Cells(39, 12)
Cells(6 + Iteration, 27) = Cells(39, 13)
Cells(6 + Iteration, 28) = Cells(39, 14)
Cells(6 + Iteration, 29) = Cells(39, 15)
'For QMIN Zinc-Jugs
Cells(6 + Iteration, 30) = Iteration
Cells(6 + Iteration, 31) = Cells(40, 4)
.... blah, blah, blah and so on for all products....
Cells(6 + Iteration, 444) = Cells(561, 14)
Cells(6 + Iteration, 445) = Cells(561, 15)
Next Iteration
End Sub
这些语句左边代表记录输出数据的表位置,右边是上述公式的输出结果。
我注意到此VBA按顺序运行每一行代码。每一行都导致500个易变的
RAND()
函数重新计算。在Core i7/32GB RAM的8个核心上,该VBA的一个迭代需要30秒。我想定期运行5,000次迭代。你能建议一些方法使此模型更有效地运行吗?
- 将一个单元格设置为
RAND()
,然后让所有500个引用它? - 重构VBA代码?