2011-08-03 83 views
12

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

+3

那并不” t听起来对我来说是非常随机的... – Blindy

+1

@Bindy:它是随机的,但结果不是均匀分布的。 –

+0

srand是相当不错的。如果它不足以满足您的需求,请搜索其他随机生成器(可能是提升) –

回答

13

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

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

+7

据我了解,第一种形式如何实现它是它的业务。有些平台可能不使用'std :: rand'。 –

+0

你说得对。我在看libstdC++版本。原作者应参考STL的文档。或者如果他们不想依赖它,他们应该使用第三种形式并使用'boost :: random'或C++ 0x'std :: random'。 –

6

std::random_shuffle具有用于指定RNG的模板过载。

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

reference

3

我想你可以给一个随机数发生器仿函数到std :: random_shuffle,这样你就可以能够完全控制随机数生成。寻找here,这个仿函数代替了RandomNumberGenerator模板参数。

3

一般称之为srand(time(NULL))之前调用的std :: random_shuffle()会给你你需要什么,它会给你不同的结果,每次调用的std ::时间random_shuffle()。这是因为std :: random_shuffle()在许多填充实现中(例如VS2008和gcc)在内部调用rand()。

当然,如果你想用另一个参数调用另一个超载的std :: random_shuffle,你可以自己修改一个RNG。

2

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

  • 呼叫std::random_shuffle
  • 计算序列的哈希值,将其存储在std::set
  • 丢弃该散列值是否已经存在

我没有看到如何使用自定义生成器可以保证序列是唯一的。因为C++ 14