C(++) 中的 Stata 随机数生成器

Stata random number generator in C(++)

我正在用 C++ 重写(并并行化)一些 Stata 模拟。

出于测试目的,我想使用 Stata 的随机数。

到目前为止,我的方法是在 Stata 中生成数字,将它们转储到 CSV 文件(100 MB),然后在我的 C++ 程序中读取它。这很慢而且不优雅。

理想情况下,我想用 C++ 代码生成相同的制服。

我读过 Stata 使用 KISS 算法(引用 http://blog.stata.com/tag/random-numbers/). I found a C implementation at http://www0.cs.ucl.ac.uk/staff/d.jones/GoodPracticeRNG.pdf 。但是 KISS 有多种变体,而且似乎还需要做一些工作才能使它采用单个 Stata 风格的种子,并产生统一的数字(Stata 博客建议我们采用生成的 32 位 int 和 return 0.binary_expansion 的二进制扩展)。

是否有人已经编写了 C/C++ 代码来复制从 Stata 的 uniform() 中 returned 的数字?

编辑:使用 Stata 的 "set seed" 计算的 KISS 种子似乎依赖于一个秘密函数。引用 = http://hsphsun3.harvard.edu/cgi-bin/lwgate/STATALIST/archives/statalist.1210/date/article-1132.html

我最终发现可以通过 plugin.

从 Stata 中调用 C/C++ 代码

特别是可以在 Stata 中使用 C++11 的 Mersenne Twister RNG。

代码 (cpprandom.cpp) 和演示 (cpprandom.do) 在我的 github account. You need the files stplugin.c and stplugin.h from the Stata plugin website(当然还有现代 C++ 编译器)上。