Excel中的RAND()函数对于Monte Carlo模拟有多好?
我正在Excel中使用3个variables实施蒙特卡罗模拟。 我用RAND()函数从Weibull分布(长尾)中抽样。 应用于样本的函数是非线性但平滑的(exp,ln,cos等)。 每个样本的结果是合格/不合格,总体结果是失败的概率。
在MathCad中我也通过数值积分和Monte Carlo实现了这一点,两次都得到相同的结果。 MathCad使用(我认为)Mersenne Twister随机数发生器。
我的Excel电子表格得到一致的不同结果(即总是更大)。 我检查过的方程式是一样的。
Excel使用什么样的随机数生成器,它有多好? 这可能是我的问题的根源吗? 我假设exp,cos等的Excel实现都可以。
最后,有没有一种方法来实现蒙特卡洛来减轻特定随机数发生器的(已知的)不良性质? (我听说马尔可夫链,随机散步等等,但是对这些并不了解)
非常感谢。
有关McCullough(2008)关于此主题的期刊论文: 关于Microsoft Excel 2007(计算统计和数据分析)中统计过程的准确性,
引用原文:
随机数发生器一直不足。 在Excel 2003中,Microsoft试图实施Wichmann-Hill生成器,但未能正确实施。 固定版本出现在Excel 2007中,但是此修复程序不正确。 微软有两次没能正确实现构成Wichmann-Hill发生器的十几行代码; 这是任何本科计算机专业应该能够做到的。 Excel随机数发生器不满足随机数发生器用于科学目的的基本要求:
- (L'Ecuyer)和Simard's(2007)CRUSHtesting(这些取代了Marsaglia(1996)的DIEHARDtesting – 参见Altman等人(2004)作为比较)通过标准随机性testing是未知的。
- 在中等数量的维度上产生大致独立的数字是未知的;
- 它有一个未知的周期长度; 和
- 这是不可复制的。
有关这些观点的进一步讨论,请参阅McCullough(2008)的文章 。 Excel 2007在这方面的performance是不够的。
由于这是Google“Excel的RAND()函数有多好”的最佳结果,所以值得为更高版本的Excel更新答案
这篇由Guy Melard撰写的文章“ 关于Microsoft Excel 2010中统计过程的准确性 ”testing了Excel 2010中的RAND()函数,发现它在2007年或2003年将大大改善。微软从一个不正确的Wichmann和Hill生成器(2007 / 2003)到Mersenne Twisteralgorithm,该algorithm具有更多的周期长度。
那篇论文的作者通过“小粉碎”,“粉碎”和“大粉碎”的随机性testing,几乎通过了所有的testing。
所以虽然肯定不是真正的随机数字,Excel 2010中的RAND()函数以及推测是较新的版本不能再被认为是可怕的。
但需要注意的是,Excel 2010仍然使用两种完全不同的VBA随机数生成器algorithm和数据分析工具包中的RNG。 根据Melard的说法,这两者都很糟糕,事实上VBA每次都使用相同的种子编号,因此产生相同的编号。
我最大的抱怨在Excel中的随机数字是
- 你不能设置种子,所以这些数字是不可重现的
- 每次按下input/删除键时,随机数字都会更新,即使将计算选项设置为手动,在保存Excel文件时它们仍会更新
有这个商业产品。 在我厌倦了寻找之前,Google变成了两个
http://www.mathwave.com/articles/random-numbers-excel-worksheets.html
http://www.ozgrid.com/Services/excel-random-number-generator.htm
保罗·威尔莫特(Paul Wilmott)在他的“定量金融学”(Quantitative Finance)一书中简单地将12次调用的结果加起来,并将6减去一个很好的近似于正态variables的值。 快速肮脏
RAND()
是非常随机的,但是对于Monte Carlo模拟,可能有点过于随意(除非你正在进行素性testing)。 大多数蒙特卡洛模拟只需要伪随机和确定性序列。 作为Excel分析工具包的一部分, RANDBETWEEN()
可能是伪随机序列所需的全部。