为了洗牌字符串st
的字符,我使用std::shuffle
和一个随机数生成器,它由一个已知的种子提供。这是编码器的一部分,为简单起见,它只是打乱输入。
打乱的数据将被发送到解码器。在那一边,我们无法访问原始输入,但无法访问洗牌的输入。
如何使用相同的随机数生成器和相同的种子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;
}
我建议遵循算法
- 生成包含
st.size()
元素std::iota
的矢量indices
。
用 - 相同的引擎和相同的种子洗牌该向量。
- 在遍历随机向量时,生成一个新的字符串
result
其中result[indices[i]] = st[i]