簡體   English   中英

C++ - 是否可以使用 random_shuffle 一次且僅一次生成數組的每個排列?

[英]C++ - is it possible to generate every single permutation of an array, once and only once, using random_shuffle?

我的任務是測試排序算法,方法是將長度為 'n' 的數組的每一個排列“送入”一次。 我應該用 random_shuffle 來做。

我知道 random_shuffle 遵循均勻分布 - 也就是說,每個排列都有相同的生成機會 - 但這並不意味着每個排列都會在獲得重復結果之前生成一次,對吧? 比如說,如果第一個結果是 12345,那么它應該是 5! 使用 random_shuffle 得到重復的 12345 結果。 但事實並非如此。 我經常得到重復的結果。 這是我正在使用的代碼:

#include <cmath>
#include <algorithm>

using namespace std;

int main()
{
int v[5]={1,2,3,4,5}, w[5], cuenta=1;
memcpy(w,v,sizeof v);
srand(time(0));

do {
    random_shuffle(v,v+5);
    for (int j=0;j<5;j++)
        cout << v[j];
    cout << endl;
    cuenta++;
    cout << cuenta << endl;
    } while (memcmp(w,v,sizeof v));
}

難道我做錯了什么? 或者這只是 random_shuffle 的運作方式?

編輯:

我知道 next::permutation 會更有意義。 我知道這使事情過於復雜。 但是我的老師堅持我這樣做,因為 random_shuffle 遵循均勻分布,所以我不應該得到重復的結果; 因此與我閱讀的所有內容(包括文檔)相矛盾。 必須使用 random_shuffle。 我只是在尋找此功能的確認/特定行為。 即便如此,next_permutation 也不是隨機的。

你必須使用random_shuffle嗎? 這似乎是此函數的錯誤算法,因為無法保證實際需要多少次嘗試才能獲得所有n! 不同的排列。 更合適的算法是std::next_permutation 如:

 do {
     // test your sort
 } while (std::next_permutation(v, v+5)); 

使用random_shuffle ,您必須實際檢查這是否是您之前完成的排列,並做所有這些額外的工作以確保您沒有錯過任何一個。 我的意思是,如果您必須將它用於作業,則必須使用它,但我盡量不要:)

[更新] 我只是有一個想法。 也許你的老師只是想讓你嘗試很多不同的排列,而不一定是所有的排列? 喜歡:

for (int i = 0; i < 1000; ++i) {
    std::random_shuffle(v, v+5);
    // test your sort
}

可能會測試所有排列。 可能不會。 但我覺得你的那種人不太可能被打破而這一切都過去了。

在獲得重復結果之前,不太可能每次排列都生成一次; 因此random_shuffle()不是你想要的。 random_shuffle()每次調用都獨立於其他調用。

next_permutation()可能是你想要的。 http://www.cplusplus.com/reference/algorithm/next_permutation/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM