首页 > 解决方案 > 如何在个人电脑和集群上生成相同的随机数(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 4

集群的输出是: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

尽管如此,它还是不同的。

谁能给我一个代码示例?

非常感谢。

标签: c++randomnumbers

解决方案


这个问题解释了您从中获得的一系列数字

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

即使您使用具有相同种子的相同 PRNG,也已定义实现。相比之下,PRNG 产生的随机数序列std::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。如果您不太关心随机数的质量,这可能是一个可以接受的解决方案。


推荐阅读