我正在寻找一些功能,通过使用128位密钥进行播种,以有效的方式置换向量索引。优化对我来说至关重要,因为我多次进行相同的操作。
有人可以推荐一个C / C ++开源库,其中有128位播种可用,它支持像permute这样的函数(种子,范围(最小,最大),sample_size)?
例如;如果permute(1,[0,10],10)函数给出的结果如下: 3 6 7 2 4 9 8 1 0 5,然后置换(1,[0,10],5)应该给3 6 7 2 4.
min,max和sample_size参数是动态变量。它在每次迭代时都会发生变化。
答案 0 :(得分:1)
不需要图书馆(所以它实际上是主题!)
std::shuffle
为您提供排列;它需要一个 UniformRandomBitGenerator ,例如std::mt19937
。 std::mt19937::seed()
采用一个序列,因此您可以提供128位的初始状态。而采取一个子范围当然是微不足道的。
答案 1 :(得分:1)
您可以使用Fisher–Yates_shuffle:
// Fisher–Yates_shuffle
std::vector<int>
FisherYatesShuffle(std::size_t size, std::size_t max_size, std::mt19937& gen)
{
assert(size < max_size);
std::vector<int> res(size);
for (std::size_t i = 0; i != max_size; ++i) {
std::uniform_int_distribution<> dis(0, i);
std::size_t j = dis(gen);
if (j < res.size()) {
if (i < res.size()) {
res[i] = res[j];
}
res[j] = i;
}
}
return res;
}