使用128位种子的伪随机排列

Pseudo-random permutation using 128 bit seed

本文关键字:随机 排列 128位 种子 使用      更新时间:2023-10-16

我正在寻找两个函数,它们通过使用128位密钥进行种子设定,以有效的方式排列向量的索引。优化对我来说至关重要,因为我要多次执行相同的操作。

有人能推荐一个C/C++开源库吗?在这个库中,128位种子是可用的,它支持permute(种子,范围(min,max),sample_size)这样的函数?

例如;如果permute(1,[0,10],10)函数给出的结果为:3 6 7 2 4 9 8 1 0 5,则置换(1,[0,10],5)应给出3 6 7 24。

min、max和sample_size参数是动态变量。它在每次迭代时都会发生变化。

您可以使用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;
}

实例

不需要库(所以它实际上是主题!)

std::shuffle给出了置换;它需要UniformRandomBitGenerator,例如CCD_ 2。std::mt19937::seed()取一个序列,所以您可以给它提供128位的初始状态。取一个子范围当然是微不足道的。