打乱 int/char 的数组
Unshuffle an array of int/char
为了打乱字符串 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;
}
我建议遵循以下算法
- 使用
std::iota
个 st.size()
个元素生成向量 indices
。
- 使用相同的引擎和相同的种子随机播放该向量。
- 在循环打乱后的向量时,生成一个新字符串
result
,其中 result[indices[i]] = st[i]
为了打乱字符串 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;
}
我建议遵循以下算法
- 使用
std::iota
个st.size()
个元素生成向量indices
。 - 使用相同的引擎和相同的种子随机播放该向量。
- 在循环打乱后的向量时,生成一个新字符串
result
,其中result[indices[i]] = st[i]