15
2017
12

如何产生任意分布的随机数

最近在做电子衍射,遇到一个问题。

电子从电子枪一个一个打出来,落到屏幕上,要求最终在屏幕上生成干涉条纹。

也就是说,要找到一个算法,生成满足给定分布的随机数。分布可以使任意的。

自己想到了3中方法,不说了,和网上的方法完全一致。

搜了一下生成正态分布随机数的资料。


  • 最简单的:rejection sampling,思路很简单,也很容易实现,但效率较差

  • 较复杂的:inverse CDF,直接利用累积分布函数(CDF)的反函数生成随机数,但计算中牵扯到比较复杂的误差函数erf(非初等函数)

  • 更好的:Box-Muller算法,在很长时间内都是生成正态分布随机数的"标准"算法。Box-Muller算法的特点是效率高,并且计算过程比较简单(只用到了初等函数)。参见:Box-Muller transform

  • 目前最好的(相较于其它实用算法):ziggurat算法,效率很高,很多现代的编程语言都使用了这一算法。ziggurat并不是人名,其含义是“金字形神塔”,不是埃及那个金字塔,而是古代苏美尔人建造的类金字塔结构的神坛:神坛由多层平台构成,每层平台都呈矩形、卵形或正方形,且自下而上面积逐渐减小。ziggurat算法实际上是一种改进的、包含查表操作的rejection sampling。



作者:孙晓博
链接:https://www.zhihu.com/question/29971598/answer/53562028
来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


如何产生正态分布的随机数?

box-muller

漫谈正态分布的生成



获得 Adobe Flash Player



« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。