2017-06-08 45 views
-2

爲了洗牌字符串st的字符,我使用了std::shuffle和一個隨機數生成器,它由已知的種子提供。這是一個編碼器的一部分,爲簡單起見,只需對輸入進行混洗。deshuffle int/char的數組

混洗的數據將被髮送到解碼器。在那一邊,我們沒有訪問原始輸入,但洗牌。

我怎麼能洗還原shuffledSt,使用相同的隨機數發生器和相同的種子,直到我能獲得原始字符串st

#include <random> 
#include <algorithm> 
int main (int argc, char* argv[]) 
{ 
    std::string st = "asdfgh"; 
    int seed = 1000; 

    std::shuffle(st.begin(), st.end(), std::default_random_engine(seed)); 
    std::cerr << st << '\n'; 

    std::string shuffledSt = st; 

    return 0; 
} 
+1

'常量自動saved_st(ST);'不爲你工作? –

+4

「鬆脫」?你的意思是「排序」,還是你的意思是「神奇地恢復原始字符串,不管它看起來像什麼」?或者是你真的想要一個洗牌的'st'拷貝而不是修改它的實際問題? – You

+1

'default_random_engine'是實現定義的,所以你不能這麼做。 **如果**你知道它使用的是哪種類型的隨機引擎,並且它是否是可逆的(例如線性一致的生成器),那麼你可以實現一個「解除衝突」,但是你還需要知道'std :: shuffle'也試圖反轉這個過程。所以長話短說,可能不可能。 – CoryKramer

回答

3

我建議下面的算法

  • 生成矢量indicesst.size()std::iota的元素。
  • 用相同的種子將相同引擎的向量洗牌。
  • 雖然遍歷洗牌後的矢量,產生一個新的字符串result其中result[indices[i]] = st[i]