【问题标题】:how to generate the same random number in two different environments?如何在两个不同的环境中生成相同的随机数?
【发布时间】:2021-11-12 10:54:33
【问题描述】:

我编译了完全相同的代码,在两种不同的环境(Linux 和 Visual Studio)中生成随机数。但我注意到输出是不同的。我在网上搜索并了解这两种实现会生成不同的随机数。但我需要 Linux 生成与 Visual Studio 生成的随机数相同的随机数。

那么,如何让两种不同的环境(Linux 和 Visual Studio)生成相同的随机数。任何想法。

我的代码:

void mix_dataset(array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset) {
   // size_t len = array_X_dataset.size();
  //  for (size_t i = 0; i < len; ++i) {
       // size_t swap_index = rand() % len;  
   
    mt19937 engine;
    engine.seed(3);
    for (size_t i = 0; i < 5430; ++i) {
    size_t swap_index = engine() %  5430;
        if (i == swap_index)
            continue;

        array<int, 20> data_point{  };
        data_point = array_X_dataset[i];
        array_X_dataset[i] = array_X_dataset[swap_index];
        array_X_dataset[swap_index] = data_point;
        int Y = array_Y_dataset[i];
        array_Y_dataset[i] = array_Y_dataset[swap_index];
        array_Y_dataset[swap_index] = Y;
    }
}
int main(){

srand(3);
mix_dataset(array_X_dataset, array_Y_dataset);
}

【问题讨论】:

    标签: c++ linux visual-studio environment


    【解决方案1】:

    您可以使用 mersenne twister,它具有可重现的输出(它是标准化的)。 在 2 台机器上使用相同的种子,一切顺利。

    #include <random>
    #include <iostream>
    
    int main()
    {
        std::mt19937 engine;
    
        engine.seed(1);
    
        for (std::size_t n = 0; n < 10; ++n)
        {
            std::cout << engine() << std::endl;
        }
    }
    

    你可以在这里验证,https://godbolt.org/z/j5r6ToGY7,只需选择不同的编译器并检查输出

    【讨论】:

    • 就像rand 在标准中并不意味着你应该使用它,只是MT 在标准中并不意味着你应该使用它。做出这些权衡可能是可以的,也可能不是。我倾向于避免它due to known problems
    • 感谢您的回答。那么在我的代码中包含您的解决方案的位置。您能否根据您的建议修改我的代码。
    • @SinanÜnür 注释已注明。当然,所有伪随机数都有问题,特别是如果事情需要真正安全。事实上,我并没有要求预期的用途,我认为这对于他的用例来说已经足够了。
    • @user16767585 P Kramer 提供了足够的信息让您能够在您的代码中使用它。
    • 感谢您的游览回复。是的,我知道他的回答很有帮助。但我试图将它包含在我的代码中,但仍然有问题。我认为我以错误的方式包含它
    【解决方案2】:

    由于两个平台提供的标准库函数实现不同,您需要确定一个 PRNG,它的输出给定相同的种子在两个平台上是相同的。

    无论如何,对于rand 公开的 PRNG 的质量,标准 C 提供的保证很少,严肃的应用程序应该远离它。

    无论有什么批评,例如,使用 PCG 你会处于更好的位置,因为你似乎不需要加密质量。

    另外,避免

            size_t swap_index = rand() % len;
    

    因为随机性可能会受到影响。如果您选择的库不提供替代方案,您可以改为使用拒绝抽样。

    【讨论】:

    • 感谢您的回复,但我不确定如何修复我的代码以满足您建议的相同输出。
    • 1) 决定实施。 2) 使用实现。
    • 我想在我的代码中使用相同的实现。这是rand() and srand ()
    • 由于rand的实现在不同平台上是不同的,即使函数的name是相同的,你必须选择使用一些东西else 在两种环境中产生相同的结果。我提出了一个建议,但最终,您应该评估备选方案并选择一个。
    【解决方案3】:

    如果您想要一个具有已知算法的伪随机数,则必须使用 C++ library 明确选择它们。

    您不能使用 rand() 执行此操作,因为它会因 C 库实现而异。

    请区分伪随机数生成器(将从同一个种子产生相同序列)和随机数生成器,它们几乎不可能重合。

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多