【问题标题】:Can you replicate matlab's older pseudo-random number generators in python?你能在 python 中复制 matlab 的旧伪随机数生成器吗?
【发布时间】:2019-07-09 03:37:51
【问题描述】:

我正在尝试在 python 中分析随机数的随机流。具体来说,我正在研究来自 matlab 的以下伪随机流:mt19937ar(Mersenne Twister)、mcg16807(LCG)和 swb2712(带借位生成器的修改减法)。这是 matlab 的 PRNG 的reference page

我知道 Mersenne Twister 是 python 中使用的默认随机生成器,我相信 numpy,mcg16807 也应该是可复制的,因为它是 LCG,但我不确定如何在 python 中复制 swb2712,因为它可能是专有的到matlab,我找不到源代码。我正在尝试做的事情是否可能,或者我应该诉诸使用 matlab 并收工?

【问题讨论】:

  • 欢迎来到 StackOverflow。请与Minimal, Complete, and Verifiable example 一起分享您的尝试
  • 我知道 python 很好,而且 yadda yadda,但是如果您确实可以访问 MATLAB,那么使用它不是更容易吗?这样,您还可以确保用于比较您要比较的任何内容的代码完全相同,并且不会冒险在编码方面存在一些差异,而且您可以节省时间
  • 如果您不知道对已发布算法进行了哪些修改,这将很困难。顺便说一句,如果你想重现 Matlab 产生的随机数,你也必须使用相同的方法来播种 RNG。

标签: python matlab random statistics probability


【解决方案1】:

从这个博客来看,它似乎是基于 George Marsaglia 的 ziggurat 算法的变体(生成正态分布的随机数) https://blogs.mathworks.com/cleve/2015/05/18/the-ziggurat-random-normal-generator/

两个有用的参考资料...

George Marsaglia 和 W. W. Tsang,“生成随机变量的 ziggurat 方法”。统计软件杂志 5, 1-7, 2000 http://www.jstatsoft.org/v05/i08

Jurgen A. Doornik,“一种改进的 Ziggurat 方法来生成正态随机样本。” PDF,Nutfield 学院,牛津,2005 http://www.doornik.com/research/ziggurat.pdf

该演示文稿还将其详细描述为 swb2712:Modified Subtract-with-Borrow generator,具有滞后 27 和 12 ...http://profmsaeed.org/wp-content/uploads/2009/08/MATLAB-V.ppt

希望有帮助!

【讨论】:

  • 如果将来有人偶然发现这篇文章,这是正确的解决方案,但复制修改后的算法工作量太大,因为实际上我只需要 足够 个数字来能够进行统计分析。一个更简单的解决方案是为每个相应的 rng 生成几十万/百万个数字并将它们作为变量存储在 matlab 中。然后,您可以将它们导出为 .DAT 文件以在 python 中使用。
  • 它始终是存储与资源/算法的折衷……George Marsaglia 和 Wai Wan Tsang 的论文“用于生成随机变量的 Ziggurat 方法”的 c 代码可以移植到 MATLAB (通常只直接考虑将 MATLAB 1 索引到 N 而 C 代码从 0 到 N-1 的差异。对于 JURGEN A DOORNIK 的“一种改进的 Ziggurat Method to Generate Normal Random Samples”的情况也是如此。实际上 MATLAB 接受编译后的 C - 使用 mex 函数编写代码。完成后在我的 TODO 列表中发布。
  • Jurgen A Doornik Research at doornik.com/research.html#journals 有一个 Doornik, J.A. 的条目。 (2005 年)。一种用于生成正常随机样本的改进的 Ziggurat 方法...链接到他的代码(压缩)是 doornik.com/research/ziggurat_code.zip 这将使事情变得更容易。
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 2011-09-19
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2016-12-14
  • 2016-03-08
  • 2020-10-16
相关资源
最近更新 更多