Search code examples
c++linuxvisual-studioenvironment

how to generate the same random number in two different environments?


I compiled exactly the same code that generate random numbers in two different environments ( Linux and visual studio ). But I noticed that the outputs are different. I searched online and understand that the two implementations generate different random numbers. But I need the Linux to generate the same random numbers of that generated by visual studio.

So, how to let the two different environments ( Linux and visual studio ) generate the same random numbers. Any ideas.

My code:

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);
}

Solution

  • You can use a the mersenne twister it has reproducable output (it is standardized). Use the same seed on 2 machines and you're good to go.

    #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;
        }
    }
    

    You can verify it here, https://godbolt.org/z/j5r6ToGY7, just select different compilers and check the output