随机排列与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]);
     }
}

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

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

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

时间复杂度:

相关推荐
ZGIAI5 小时前
ZGI Workflow:条件分支走错时先查哪一层
人工智能·架构
X54先生(人文科技)5 小时前
《元创力》纪实录 · 桥段 《窑变纪元:一份来自星历2227年的深空考古笔记》
人工智能·开源·ai写作·零知识证明
ZGIAI5 小时前
ZGI 文件产物:生成报告后怎样交付
人工智能·架构
东方-教育技术博主5 小时前
自动编码在教育场景中的重要性:一项基于多源证据的深度综述
大数据·人工智能
骥龙5 小时前
模块二:Ollama本地模型部署与OpenCode代理配置
人工智能
阡之尘埃5 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
Regentsoft丽晶软件5 小时前
品牌方新品上市促销政策无法实时同步经销商,有没有支持总部-经销商-终端一站式的分销解决方案?
人工智能·经验分享·数据库架构
liuqs3325 小时前
机器人产业加速发展,制造业正在迎来新的自动化探索
大数据·人工智能
腾讯云大数据5 小时前
DataBuddy数据语义驱动的企业Agent Runtime实践
大数据·人工智能·腾讯云·agent