2011-08-03 153 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