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顺序,然后手动反转交换。请参阅。可能重复的