Я скомпилировал точно такой же код, который генерирует случайные числа в двух разных средах (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);
}
0
user16767585 17 Сен 2021 в 17:55

3 ответа

Лучший ответ

Вы можете использовать крутилку Мерсенна, у нее есть воспроизводимая продукция (она стандартизирована). Используйте одно и то же семя на 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, просто выберите разные компиляторы и проверьте вывод

1
P Kramer 17 Сен 2021 в 15:18

Если вам нужно псевдослучайное число с известным алгоритмом, вы должны выбрать их оба явно с помощью C ++ библиотека.

Вы не можете сделать это с помощью rand(), потому что он будет варьироваться в зависимости от реализации библиотеки C.

И, пожалуйста, различите генераторы псевдослучайных чисел (которые будут генерировать одну и ту же последовательность из одного и того же начального числа) и случайные, которые вряд ли будут совпадать.

0
Useless 17 Сен 2021 в 15:05

Поскольку реализации стандартных библиотечных функций, предлагаемые двумя платформами, различаются, вам необходимо выбрать ГПСЧ, выходные данные которого с одинаковым начальным значением будут одинаковыми на обеих платформах.

Стандарт C предоставляет очень мало гарантий, когда дело доходит до качества ГПСЧ, предоставляемого rand в любом случае, и серьезные приложения должны держаться подальше от этого.

Какой бы ни была критика, вам будет удобнее использовать, например, PCG, поскольку похоже, вам не нужно криптографическое качество.

Кроме того, избегайте

        size_t swap_index = rand() % len;

Поскольку может пострадать случайность. Вместо этого вы можете использовать выборку отклонения, если выбранная вами библиотека не предлагает альтернативы.

0
Sinan Ünür 17 Сен 2021 в 15:13