如何确保std :: random_shuffle总是产生不同的结果?

时间:2011-08-03 19:13:14

标签: c++ random std shuffle

是否有一些类似于srand()的函数需要调用以确保std::random_shuffle()始终产生不同的结果?即如果我用相同的数据多次调用它,我希望每次订单都不同。我怎样才能确定?

6 个答案:

答案 0 :(得分:13)

std::random_shuffle有两种形式。一个需要2个参数(开始/结束迭代器),另一个需要3个(开始/结束迭代器和随机生成器)。

第一个表单使用std::rand(),因此您可以使用std::srand()为其随机数生成器播种。您也可以使用3参数版本并自己提供RNG。

答案 1 :(得分:6)

std::random_shuffle有一个用于指定RNG的模板重载。

template <class RandomAccessIterator, class RandomNumberGenerator>
  void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                        RandomNumberGenerator& rand );

reference

答案 2 :(得分:5)

自p ++ 14(在C ++ 17中删除)以来,

random_shuffle已被弃用,并被替换为shuffle(自C ++ 11以来存在) http://en.cppreference.com/w/cpp/algorithm/random_shuffle

可能的用法:

shuffle(items.begin(), items.end(), std::default_random_engine(std::random_device()()));

答案 3 :(得分:3)

我认为你可以给std :: random_shuffle一个随机的生成器函子,这样你就可以完全控制随机数的生成。查看here,此仿函数取代了RandomNumberGenerator模板参数。

答案 4 :(得分:3)

通常在调用std :: random_shuffle()之前调用srand(time(NULL)) 将为您提供所需内容,每次调用std :: random_shuffle()时,它会给您不同的结果。这是因为std :: random_shuffle()在许多填充实现中内部调用rand()(例如VS2008和gcc)。

当然,如果你想用额外的参数调用另一个重载的std :: random_shuffle,你可以自己补充一个RNG。

答案 5 :(得分:2)

作为最后的手段,您可以:

  • 致电std::random_shuffle
  • 计算序列的哈希值,将其存储在std::set
  • 放弃哈希是否已存在

我没有看到使用自定义生成器如何保证序列是唯一的。