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

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

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

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

时间复杂度:

相关推荐
AI多Agent协作实战派5 小时前
【AI探索历程17】从“给自己用“到想“让别人用“
人工智能
吴佳浩6 小时前
Memory Provider 实战:Hermes、Mem0、Honcho、Hindsight 为什么都这样设计?
人工智能·agent·ai编程
吴佳浩6 小时前
企业级 Agent Memory 选型指南:如何构建可扩展的 Memory Service?
人工智能·agent·ai编程
北方的银狐-Zero7 小时前
ERP 管执行,数据管标准,OntoL本体 管思考:企业智能化升级的规划图
大数据·人工智能·本体论
浅安的邂逅8 小时前
260918-白帽把 OpenAI 论坛“打穿“了:攻防赛漏洞、账户被 Claude 入侵、模型偷偷掩盖不当行为
人工智能·大模型·ai编程·ai模型·行业动态
jinyishu_8 小时前
认识 AI Agent:概念、架构、设计模式与主流框架
人工智能
Hrain-AI8 小时前
AI 爬虫三档授权工程落地:搜索放行、训练拦截、Agent 分层(附脚本)
人工智能·elasticsearch·milvus
sunhy_csdn8 小时前
“词码”作为 Token 候选译名
人工智能
Hrain-AI8 小时前
多 Agent 并行不打架:worktree 隔离与反馈回流落地(附脚本)
网络·数据库·人工智能·架构