随机排列与Fisher-Yates算法

目录

[1. 随机排列](#1. 随机排列)

[2. 均匀随机排列](#2. 均匀随机排列)

[3. Fisher-Yates Shuffle: Original Version](#3. Fisher-Yates Shuffle: Original Version)

[4. Fisher-Yates Shuffle: Modern Version](#4. Fisher-Yates Shuffle: Modern Version)


1. 随机排列

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

2. 均匀随机排列

上面是集合 的均匀随机排列。

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

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

3. Fisher-Yates Shuffle: Original Version

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

时间复杂度:

4. Fisher-Yates Shuffle: Modern Version

cpp 复制代码
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]);
     }
}

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

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

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

时间复杂度:

相关推荐
老金带你玩AI2 小时前
ChatGPT dots,到底能替你操多少心?
人工智能
AliCloudROS3 小时前
计算巢 X DeepSeek Harness — 云端智能体工作台
人工智能·阿里云
深蓝AI3 小时前
GitHub的Push一年涨4.9倍:AI Agent为什么逼它重做Git存储?
人工智能·github
stereohomology3 小时前
大模型的观点谨:StoryTold 「Crafting Apps」四件套 · 深度总览
人工智能·llm
运维行者_4 小时前
网络性能监控怎么做?从自动发现到根因分析的4个环节
运维·服务器·网络·人工智能·支持向量机
Su米苏4 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
美狐美颜sdk4 小时前
直播APP源码可以直接接入视频美颜sdk吗?技术方案详解
android·人工智能·音视频·美颜sdk·直播美颜sdk
问商十三载4 小时前
AI引擎生成式优化实践:刑事辩护律师团队IP构建
大数据·人工智能
冬奇Lab4 小时前
LLM 驱动的自动化测试系列(08):移动端自动化(四)——AppAgent:解析树与视觉特征的结合
人工智能·测试