使用128位种子的伪随机置换

时间:2016-08-03 07:07:58

标签: c++ c random permutation

我正在寻找一些功能,通过使用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参数是动态变量。它在每次迭代时都会发生变化。

2 个答案:

答案 0 :(得分:1)

不需要图书馆(所以它实际上是主题!)

std::shuffle为您提供排列;它需要一个 UniformRandomBitGenerator ,例如std::mt19937std::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;
}

Live example