使用128位种子的伪随机排列
Pseudo-random permutation using 128 bit seed
我正在寻找两个函数,它们通过使用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位的初始状态。取一个子范围当然是微不足道的。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么不;名字在地图上是按顺序排列的吗
- 字符串-C++后显示的随机字符
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 按对象的特定方法按升序排列的C++优先级队列
- 取消随机排列整数/字符数组
- 如何在C++中随机排列指针列表
- 哈希函数和随机排列
- 伪随机分布,它保证了值序列-C++的所有可能的排列
- 如何随机排列数组问题
- 对 C++ 中的数组执行随机排列
- 随机排列链表
- 在每台计算机上生成相同的随机排列
- 有效地计算随机排列中的第n项
- 随机排列具有特征矩阵的行/列
- 使用128位种子的伪随机排列