python - 与 Python3 numpy.random.rand 计算的 C++ 中相同的随机数

标签 python c++ random

我想在 C++ 中复制一些已经在 Python3 中实现的代码的测试,这些代码依赖于 numpy.random.randrandn值和特定种子(例如, seed = 1 )。
我知道 Python 的随机实现基于梅森扭曲器。 C++ 标准库也在 std::mersenne_twister_engine 中提供了这一点。 .
C++ 版本返回一个 unsigned int,而 Python rand 是一个浮点值。
有没有办法在 C++ 中获得与在 Python 中生成的相同的值,并确保它们相同?由 randn 生成的数组也是如此?

最佳答案

对于整数值,您可以这样做:

import numpy as np

np.random.seed(12345)
print(np.random.randint(256**4, dtype='<u4', size=1)[0])
#include <iostream>
#include <random>

int main()
{
    std::mt19937 e2(12345);
    std::cout << e2() << std::endl;
}
两个片段的结果都是 3992670690

通过查看 source coderand您可以通过以下方式在 C++ 代码中实现它:
import numpy as np

np.random.seed(12345)
print(np.random.rand())
#include <iostream>
#include <iomanip>
#include <random>

int main()
{
    std::mt19937 e2(12345);
    int a = e2() >> 5;
    int b = e2() >> 6;
    double value = (a * 67108864.0 + b) / 9007199254740992.0;
    std::cout << std::fixed << std::setprecision(16) << value << std::endl;
}
两个随机值都是 0.9296160928171479

使用会很方便 std::generate_canonical ,但它使用另一种方法将梅森扭曲器的输出转换为双倍。他们不同的原因很可能是generate_canonical比 NumPy 中使用的随机生成器更优化,因为它避免了代价高昂的浮点运算,尤其是乘法和除法,如 source code 所示.然而,它似乎取决于实现,而 NumPy 在所有平台上产生相同的结果。
double value = std::generate_canonical<double, std::numeric_limits<double>::digits>(e2);
这不起作用并产生结果 0.8901547132827379,这与 Python 代码的输出不同。

关于python - 与 Python3 numpy.random.rand 计算的 C++ 中相同的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65871948/

相关文章:

python - 呈现形式 ('utf-8' 中的 Django UnicodeEncodeError )

c++ - 如果我重载了原始 "operator new",如何调用它?

sql - 从表中选择前 N 个随机行,然后按列排序

Python 正则表达式 - 从路径中提取目录

python - Pandas 重新采样 ffill() 最后一行

python - 如何在 Linux 命令提示符下调用外部输入和输出文件名来运行 Python 程序

c++ - NCurses getch 总是返回 ERR (-1)

c++ - 如果存在 QSQLITE 数据库,则根据 qt 中的行值插入或更新

objective-c - D std.random 整数和小数均匀随机数生成之间的不同行为

java - 使用任何编程语言生成真随机数生成器