云计算百科
云计算领域专业知识百科平台

随机排列与Fisher-Yates算法

目录

1. 随机排列

2. 均匀随机排列

3. Fisher-Yates Shuffle: Original Version

4. Fisher-Yates Shuffle: Modern Version


1. 随机排列

将上面7张牌进行随机排列,可能会得到下面结果。

2. 均匀随机排列

上面是集合 \\{A,B,C\\} 的均匀随机排列。

若一个集合含有 n 个元素,则共有 n! 种排列。

  • 从 n! 种可能的序列中等概率随机选取一个。
  • 某个元素出现在 n 个任意位置上的概率相等。
  • 某个位置上为 n 个任意元素之一的概率相等。

3. Fisher-Yates Shuffle: Original Version

进行 n 轮循环,每轮循坏从原序列随机抽取一个元素,写入排列数组中,原序列中的空位由被抽取元素的后面元素都左移一位补平。

时间复杂度:O(n^2)

4. Fisher-Yates Shuffle: Modern Version

void permute(int arr[], int n){
for (int i=0; i<=n-2; i++){
// k从{0,1,…, n-i-1}中随机取样
int k = uniform(n-i);
// j的范围{i, i+1, …, n-1}
int j = i + k;
// 交换arr[i]和arr[j]
swap(arr[i],arr[j]);
}
}

第一轮循环中,随机抽取一个元素,与第一个元素交换,并且固定第一个元素。

第二轮循环中,把原来的第二个元素当作第一个元素,随机抽取一个元素,与第一个元素交换位置,并且固定第一个元素。

以此类推,第 i(1\\leq i\\leq n-1) 轮循环中,把原来的第 i(1\\leq i\\leq n-1) 个元素当作第一个元素,随机抽取一个元素,与第一个元素交换位置,并且固定第一个位置。

时间复杂度:O(n)

赞(0)
未经允许不得转载:网硕互联帮助中心 » 随机排列与Fisher-Yates算法
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!