C++ 取消填充int/char数组

C++ 取消填充int/char数组,c++,arrays,shuffle,C++,Arrays,Shuffle,为了洗牌字符串st,我使用了std::shuffle和一个随机数生成器,该生成器由一个已知种子提供。这是一个编码器的一部分,为了简单起见,它只是洗牌输入 洗牌后的数据将被发送到解码器。在那一边,我们无法访问原始输入,但可以访问洗牌输入 如何使用相同的随机数生成器和相同的种子取消缓冲字符串shuffled st,直到获得原始字符串st #include <random> #include <algorithm> int main (int argc, char* argv[

为了洗牌字符串
st
,我使用了
std::shuffle
和一个随机数生成器,该生成器由一个已知种子提供。这是一个编码器的一部分,为了简单起见,它只是洗牌输入

洗牌后的数据将被发送到解码器。在那一边,我们无法访问原始输入,但可以访问洗牌输入

如何使用相同的随机数生成器和相同的种子取消缓冲字符串
shuffled st
,直到获得原始字符串
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;
}
#包括
#包括
int main(int argc,char*argv[])
{
std::string st=“asdfgh”;
int种子=1000;
std::shuffle(st.begin()、st.end()、std::default_random_引擎(seed));

我建议使用以下算法

  • 使用
    st.size()
    元素的
    std::iota
    生成向量
    索引
  • 用相同的引擎和相同的种子洗牌该向量
  • 在无序向量上循环时,生成一个新字符串
    result
    ,其中
    result[index[i]]=st[i]

“Unshuffle”?您的意思是“排序”,还是“神奇地恢复原始字符串,不管它看起来是什么样子”?或者实际的问题是您真的想要一个
st
的无序副本而不是修改它吗?
default\u random\u engine
是实现定义的,所以您不能以可移植的方式执行。如果您知道它使用的是哪种类型的随机引擎,并且它是可逆的(例如线性同余生成器)然后,您可以实现“取消缓冲”但是您还需要知道
std::shuffle
的实现,才能尝试反转该过程。长话短说,这可能是不可能的。您可以使用循环来保持洗牌,直到获得与原始值相等的值。当然,这对于大字符串来说并不有效……尽管
std::shuffle
是在实现的ion已定义,它有一个相当于Fisher-Yates shuffle的实现。虽然
std::default_random_engine
也有实现定义,但您可以使用它和已知种子重新生成Fisher-Yates中使用的shuffle顺序,然后手动反转交换。请参阅。可能重复的