Excel中用于蒙特卡罗模拟的RAND()函数有多好?

时间:2011-05-04 15:50:08

标签: excel vba excel-vba statistics

我正在Excel中的3个变量中实现蒙特卡罗模拟。我已经使用RAND()函数从Weibull分布中采样(带有长尾)。应用于样本的函数是非线性但平滑的(exp,ln,cos等)。每个样本的结果是通过/失败,总体结果是失败的概率。

我也通过MathCad中的数值积分和蒙特卡罗实现了这一点,两次得到相同的结果。 MathCad使用(我认为)Mersenne Twister随机数生成器。

我的Excel电子表格得到的结果始终不同(即总是更大)。我检查了方程是一样的。

Excel使用什么随机数生成器,它有多好?这可能是我问题的根源吗?我假设exp,cos等的Excel实现都可以。

最后,有没有办法实现蒙特卡罗来减轻特定随机数生成器的(已知的)不良属性? (我听说马尔可夫链,随机走路等,但对它们并不是很了解)

非常感谢。

5 个答案:

答案 0 :(得分:23)

由于这是谷歌“Excel的兰德()功能有多好”的最佳结果,因此值得更新以后版本的Excel的答案

Guy Melard撰写的这篇论文“On the accuracy of statistical procedures in Microsoft Excel 2010”测试了Excel 2010中的RAND()函数,发现它在2007年或2003年有了很大的改进。微软从错误的Wichmann和Hill发生器切换(2007/2003) Mersenne Twister算法,它具有更长的循环长度。

该论文的作者通过“小粉碎”,“粉碎”和“大粉碎”测试随机性,并且几乎通过了所有测试。

因此虽然它确实与真随机数不同,但Excel 2010中的RAND()函数以及可能更新的版本再也不能被认为是可怕的。

但应注意,Excel 2010仍然为VBA随机数生成器和数据分析工具包中的RNG使用两种完全不同的算法。根据Melard的说法,两者都很糟糕,实际上VBA每次使用相同的种子数,因此产生相同的数字。

我对Excel中随机数的最大抱怨是

  • 您无法设置种子,因此数字不可重现
  • 每次按Enter / delete时随机数都会更新,即使您将计算选项设置为手动,它们仍然会在您保存Excel文件时更新

答案 1 :(得分:18)

McCullough(2008)有一篇关于这个主题的期刊论文: On the accuracy of statistical procedures in Microsoft Excel 2007 (Computational Statistics and Data Analysis)

引用原始文章:

  

随机数生成器始终如一   不合适。使用Excel 2003,   微软试图实施   Wichmann-Hill发电机并未能成功   正确实施。 已修复   版本出现在Excel 2007中但是这个   修复未正确完成。微软两次未能实施   正确的十几行代码   构成Wichmann-Hill   发电机;这是任何事情   本科计算机科学专业   应该可以做到的。 Excel随机   数字生成器不符合   随机数的基本要求   发电机用于科学   用途:

     
      
  1. 不知道通过标准随机性测试,例如L'Ecuyer和   Simard(2007)CRUSH测试(这些   取代Marsaglia(1996)DIEHARD   测试 - 见Altman等。 (2004)a   比较);
  2.   
  3. 不知道产生大致独立的数字   适度的维度;
  4.   
  5. 它的周期长度未知;和
  6.   
  7. 不可再现。
  8.   

有关这些要点的进一步讨论,请参阅随附的article by McCullough (2008); Excel 2007在这方面的表现不足。

答案 2 :(得分:-1)

答案 3 :(得分:-2)

保罗·威尔莫特(Paul Wilmott)在他的“定量金融”(Quantitative Finance)一书中,简单地将12次调用RAND()的结果加起来,并减去6次,以获得与Normal变量的良好近似。 快速肮脏

答案 4 :(得分:-4)

RAND()非常随机,但对于蒙特卡罗模拟,可能有点过于随意(除非你做素性测试)。大多数蒙特卡罗模拟只需要伪随机和确定性序列。作为Excel分析工具的一部分,伪随机序列可能只需要RANDBETWEEN()