如何在个人计算机和群集 (c++) 上生成相同的随机数



我想知道如何使用我的个人计算机和集群生成完全相同的随机数。

这是一个简单的代码。

#include <iostream>
#include <random>
int main()
{
int N = 10;
for (int j = 0; j < N; j++)     std::cout << rand() % 10 << " ";;
}

我的个人计算机的输出是: 1 7 4 0 9 4 8 8 2 四

群集的输出为: 3 6 7 5 3 5 6 2 9 1

这些随机数的差异会强烈影响我的计算。此外,我的问题非常灵活,我无法使用从个人计算机生成的随机数并将其用作集群的输入。我希望在不同的平台上生成相同的随机数。

///新尝试: 我在链接中尝试了解决方案:如果我们在不同的机器上将 c++11 mt19937 播种为相同,我们会得到相同的随机数序列吗

我使用了代码:

#include <random>
#include <iostream>
int main()
{
/* seed the PRNG (MT19937) using a fixed value (in our case, 0) */
std::mt19937 generator(0);
std::uniform_int_distribution<int> distribution(1, 10);
/* generate ten numbers in [1,10] (always the same sequence!) */
for (size_t i = 0; i < 10; ++i)
{
std::cout << distribution(generator) << ' ';
}
std::cout << std::endl;
return 0;
}

在我的电脑上,我得到了输出:5 10 4 1 4 10 8 4 8 4

在集群上,我得到:6 6 8 9 7 9 6 9 5 7

不过,情况有所不同。

谁能给我一个代码的例子?

多谢。

这个问题解释了你从中获得的数字序列

std::uniform_int_distribution<int> distribution(1, 10);

是定义的实现,即使您使用相同的 PRNG 和相同的种子。相比之下,PRNGstd::mersenne_twister_engine生成的随机数序列在任何符合标准的实现中都是明确定义的。

因此,在不使用外部库的情况下获取定义良好的伪随机数序列的最简单方法是:

#include <iostream>
#include <random>
int main() {
std::mt19937 generator(0);
while (true) {
const auto rand = generator() % 10;
std::cout << rand << ' ';
}
}

此代码保证始终生成相同的序列,4 9 3 0 3 9 7 3 7 3 ....这些数字分布不均匀,原因与rand() % 10产生的数字不均匀的原因相同。如果您不太关心随机数的质量,这可能是一个可接受的解决方案。

您可以轻松地为随机函数使用固定种子。这样做,您将始终在PC和群集上获得相同的序列。

#include <iostream>
#include <random>
#define FIXED_SEED 12345 // It can be any integer
int main()
{
int N = 10;
srand(FIXED_SEED)
for (int j = 0; j < N; j++)
std::cout << rand() % 10 << " ";;
}

此外,由于您正在使用C++您可以使用C++随机机器来生成伪随机序列。你可以用它们获得相同的结果,但分布更精确,反正没什么大不了的。

最新更新