[英]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.