洗牌算法具体指什么?

2024-04-06 07:48
文章标签 算法 具体 洗牌

本文主要是介绍洗牌算法具体指什么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是洗牌算法?

洗牌算法是我们常见的随机问题,在玩游戏、随机排序时经常会碰到。本质是让一个数组内的元素随机排列,即数组乱序。

如何证明数组乱序的随机性能?

对于任意数组,数组中元素个数n >= 2,n为自然数。如果可以证明经过这个算法将数组乱序,数组中每个元素出现在 n 个位置任意一个位置的概率都是 1/n,即可以说明随机性良好。

常见的概率计算?

定理:设A、B是互不相容事件(AB=φ),则:P(A∪B)=P(A)+P(B)

条件概率:已知事件B出现的条件下A出现的概率,称为条件概率,记作:P(A|B)

                条件概率计算公式:

                当P(A)>0,P(B|A)=P(AB)/P(A)

                当P(B)>0,P(A|B)=P(AB)/P(B) 

乘法公式 P(AB)=P(A)×P(B|A)=P(B)×P(A|B)

相互独立事件

 相互独立事件: 事件A(或B)是否发生对事件B(A)发生的概率没有影响,这样的两个事件叫做相互独立事件。相互独立事件同时发生的概率P(A*B) =P(A) *P(B)

 

互斥事件

互斥事件:指的是不可能同时发生的两个事件。

 例如:事件A和B的交集为空,A与B就是互斥事件,也叫互不相容事件。也可叙述为:不可能同时发生的事件。如A∩B为不可能事件(A∩B=Φ),那么称事件A与事件B互斥,其含义是:事件A与事件B在任何一次试验中不会同时发生。

 

如何使用数学归纳法证明数组乱序的随机性?

证明:数组中元素个数n >= 2,n为自然数,经过该算法将数组乱序,数组中每个元素出现在 n 个位置任意一个位置的概率都是 1/n.

 

1.当n=2时,根据算法,显然有 1/2 的概率两个数交换,有 1/2 的概率两个数不交换,因此对 n = 2 的情况,元素出现在每个位置的概率都是 1/2,满足随机性要求。

2、假设n=m时,算法的随机性符合要求。

事件C:当数组中有m个元素时,元素出现的每个位置。P(C)=1/m

事件A:元素出现在末尾位置。 P(A)=1/(m+1)

事件B:元素出现在非末尾位置。A、B为相互对立事件,P(B)=1-P(A)=m/(m+1)

在元素出现在非末尾位置的条件下,元素出现在其他m个位置的概率。P(BC)

根据概率计算的乘法法则P(AB)=P(A)×P(B|A)=P(B)×P(A|B)

P(BC)==P(B)×P(C|B)=P(C)×P(B|C)

事件B和事件C为相互独立事件

P(C|B)=P(C),P(B|C)=P(B)

综上所述,P(BC)=P(B)×P(C)=[m/(m+1)]×[1/m]=1/(m+1)

即可证明n=m+1

结论:对于任意大于等于2的自然数n,算法随机性均符合要求。

 

问题讨论:

1.数学归纳法的适用范围?

最简单和常见的数学归纳法是证明当n等于任意一个自然数时某命题成立。证明分下面两步:
证明当n = 1时命题成立。

证明如果在n = m时命题成立,那么可以推导出在n = m+1时命题也成立。(m代表任意自然数)

2.数学归纳法的原理?

 

这种方法的原理在于:首先证明在某个起点值时命题成立,然后证明从一个值到下一个值的过程有效。当这两点都已经证明,那么任意值都可以通过反复使用这个方法推导出来。把这个方法想成多米诺效应也许更容易理解一些。例如:你有一列很长的直立着的多米诺骨牌,如果你可以:

证明第一张骨牌会倒。
证明只要任意一张骨牌倒了,那么与其相邻的下一张骨牌也会倒。
那么便可以下结论:所有的骨牌都会倒下。

3.互不相容事件和相互对立事件的关系?

相互对立事件是互不相容事件的一个特例。

若A交B为不可能事件,A并B为必然事件,那么称A事件与事件B互为对立事件,其含义是:事件A和事件B必有一个且仅有一个发生。

 

这篇关于洗牌算法具体指什么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/879396

相关文章

Pandas透视表(Pivot Table)的具体使用

《Pandas透视表(PivotTable)的具体使用》透视表用于在数据分析和处理过程中进行数据重塑和汇总,本文就来介绍一下Pandas透视表(PivotTable)的具体使用,感兴趣的可以了解一下... 目录前言什么是透视表?使用步骤1. 引入必要的库2. 读取数据3. 创建透视表4. 查看透视表总结前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1