簡體   English   中英

使用128位種子的偽隨機置換

[英]Pseudo-random permutation using 128 bit seed

我正在尋找一些函數,這些函數可以通過播種128位密鑰來有效地置換向量的索引。 優化對我來說至關重要,因為我多次執行相同的操作。

誰能建議一個C / C ++開源庫,其中提供128位種子並且支持諸如permute(seed,range(min,max),sample_size)之類的功能?

例如; 如果permute(1,[0,10],10)函數給出的結果為:3 6 7 2 4 9 8 1 0 5,則permute(1,[0,10],5)應該給出3 6 7 2 4 。

min,max和sample_size參數是動態變量。 它在每次迭代時都會更改。

無需庫(因此實際上是主題!)

std::shuffle為您提供排列; 它需要一個UniformRandomBitGenerator例如std::mt19937 std::mt19937::seed()采用一個序列,因此您可以向其提供128位初始狀態。 當然,取一個子范圍是微不足道的。

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

現場例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM