std :: random_shuffle没有播种

时间:2016-04-22 05:58:57

标签: c++ random random-seed

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>


int main() {
    std::vector<short> a(256);
    for (short x = 0; x != 256; ++x) {
        a[x] = x;
    }
    for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl;
    std::cout << std::endl;

    std::srand(11);

    std::random_shuffle(a.begin(), a.end());
    for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl;
    std::cout << std::endl;

    for (short x = 0; x != 256; ++x) {
        a[x] = x;
    }
    for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl;
    std::cout << std::endl;

    std::srand(11);

    std::random_shuffle(a.begin(), a.end());
    for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl;
}

所以,这是我的代码。我所期待的显然是两次同样的洗牌。我得到的是,虽然洗牌在发布之间是一致的,但它们是不同的,似乎忽略了srand!我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

首先请注意,您使用的std::random_shuffle版本已被弃用。

另请注意(来自之前的参考链接)

  

...经常使用函数std::rand

此处的关键字通常是 ,而总是

如果要确保始终创建相同的序列,那么您应该使用其中一个备选方案,传递特定的随机数函数,或使用std::shuffle函数传递生成器(来自C ++ 11“new”PRNG classes)。

答案 1 :(得分:2)

请注意,对于std::random_shuffle,使用的是随机数生成器是实现定义的,它不能保证使用std::rand

您可以使用std::shuffle代替并传递一个随机数生成器:

std::random_device rd;
std::mt19937 g(rd());
std::shuffle(a.begin(), a.end(), g);

LIVE