不能std :: shuffle?

mar*_*zzz 1 c++ random stdvector

代码是基本的:

#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] << " ";
    }
}
Run Code Online (Sandbox Code Playgroud)

它总是向我显示相同的序列.我哪里错了?

Lig*_*ica 7

实例化时rng,您没有使用ss.因此,不使用种子,序列将始终相同.

看起来你的意思是:

std::mt19937_64 rng{ss};
Run Code Online (Sandbox Code Playgroud)

您的编译器应警告您ss未使用.你出于某种原因关闭了警告吗?不幸的是,GCC似乎并没有对此发出警告-Wextra.

  • 顺便说一句,Coliru缓存如此重复地重新运行相同的片段即使这个固定也不会改变输出. (3认同)