Не в состоянии std :: shuffle? - PullRequest
       24

Не в состоянии std :: shuffle?

0 голосов
/ 05 ноября 2018

Код является базовым:

#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <algorithm>

int main(int argc, const char *argv[]) {
    std::vector<int> mSet = { 1, 2, 3, 4 };

    auto timeSeed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    std::seed_seq ss{ uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed >> 32) };
    std::mt19937_64 rng;
    std::shuffle(mSet.begin(), mSet.end(), rng);

    for (size_t i = 0; i < mSet.size(); i++) {
        std::cout << mSet[i] << " ";
    }
}

Это всегда показывает мне одну и ту же последовательность. Где я не прав?

1 Ответ

0 голосов
/ 05 ноября 2018

Когда вы создали экземпляр rng, вы не использовали ss. Таким образом, ваше семя не используется, и последовательность всегда будет одинаковой.

Похоже, вы имели в виду:

std::mt19937_64 rng{ss};

Ваш компилятор должен предупреждать вас, что ss не используется. У вас по какой-то причине отключены предупреждения? К сожалению, GCC, похоже, не предупреждает об этом даже при -Wextra.

...