随机排列算法
1. 前言
随机排列算法,目的是将一个数组中的元素随机打乱随机排列
2. Fisher-Yates洗牌算法
2.1 思路
-
获取数组长度为
-
随机选取位置上的数据,并与第一个数据交换
-
随机选取位置上的数据,并与第二个数据交换
-
重复这个过程
2.2 代码参考
void rand_permutation(const int n,
int *p)
{
typedef std::uniform_int_distribution<int> rand_int;
typedef rand_int::param_type rand_range;
static std::mt19937_64 gen;
static rand_int rdi(0, 1);
int j, k;
for (int i = 0; i < n; i++)
{
p[i] = i;
}
for (int i = 0; i < n; i++)
{
rdi.param(rand_range(0, n - i - 1));
j = rdi(gen) + i;
k = p[j];
p[j] = p[i];
p[i] = k;
}
}
std::uniform_int_distribution<int> rdi(0, 1)创建一个0到1的均匀分布对象
std::uniform_int_distribution<int>::param_type rand_range 参数范围类型
std::mt19937_64 gen创建随机数生成器
rdi.param(rand_range(0, n-i-1))将分布的范围更改到
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 雯欂の修仙笔记!