Fisher–Yates shuffle 算法

简单来说 Fisher–Yates shuffle 算法是一个用来将一个有限集合生成一个随机排列的算法(数组随机排序)。这个算法生成的随机排列是等概率的。同时这个算法非常高效。

 

Fisher–Yates shuffle 的原始版本,最初描述在 1938 年的 Ronald Fisher(上图) 和 Frank Yates 写的书中,书名为《Statistical tables for biological, agricultural and medical research》。他们使用纸和笔去描述了这个算法,并使用了一个随机数表来提供随机数。它给出了 1 到 N 的数字的的随机排列,具体步骤如下:

  1. 写下从 1 到 N 的数字
  2. 取一个从 1 到剩下的数字(包括这个数字)的随机数 k
  3. 从低位开始,得到第 k 个数字(这个数字还没有被取出),把它写在独立的一个列表的最后一位
  4. 重复第 2 步,直到所有的数字都被取出
  5. 第 3 步写出的这个序列,现在就是原始数字的随机排列

已经证明如果第 2 步取出的数字是真随机的,那么最后得到的排序一定也是。

现代方法

Fisher–Yates shuffle 算法的现代版本是为计算机设计的。由 Richard Durstenfeld 在1964年 描述。并且是被 Donald E. Knuth 在 《The Art of Computer Programming》 中推广。但是不管是 Durstenfeld 还是 Knuth,都没有在书的第一版中承认这个算法是 Fisher 和 Yates 的研究成果。也许他们并不知道。不过后来出版的 《The Art of Computer Programming》提到了 Fisher 和 Yates 贡献。

现代版本的描述与原始略有不同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MASA Framework - EventBus设计

概述利用发布订阅模式来解耦不同架构层级,亦可用于解决隔离业务之间的交互优点:松耦合横切关注点可测试性事件驱动发布订阅模式发布者通过调度中心将消息发送给订阅者。调度中心解决发布与订阅者之间的关系,保证消息可以送达订阅者手中。发布…

Qt经验积累:常见的驱动打包处理方法

Qt对于常见的驱动打包,如数据库,图片等常用的插件驱动.如果处理不好,程序运行不起来,不能加载驱动,处理方法如下:在主程序中加入以下两句话:QString strLibPath(QDir::toNativeSeparators(QApplication::applicationDirPath())QDir::separator()"plugins"); a.addLib…

wireshark-win64-3.4.0安装_这9类轴承的安装方法,你可都知道?有哪些需要注意的呢?...

轴承是当代机械设备中一种重要零部件。随着时间的推移,轴承会发生磨损,合理的安装和使用可以让机械设备减少不必要的安全隐患。前面文章讲了如何拆卸轴承,今天就给大家讲讲各类轴承应该如何安装!一、轴承安装前的准备工作轴承的安…

linux之which命令

我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置。 whereis 查看文件的位置。 locate 配合数据库查看文件位置。 find 实际搜寻硬盘查询文…

slidingmenu能否实现菜单页在内容页上方,而不是把内容页挤到一边去????...

问题描述。。。。。。。。。。。。。。。。。。。。。。。。。。。。 解决方案1这样的话 你自己写不就好了 左边菜单view显示出来加一个动画 设置view的透明度 还用什么slidingmenu啊 解决方案2这个效果不是用的slidingmenu吧,自己实现一个 解决方案3对啊&#xff0…

史上最牛数学简史

全世界只有3.14 % 的人关注了爆炸吧知识“中国现代数学之父”华罗庚曾说过宇宙之大,粒子之微火箭之速,化工之巧地球之变,生物之谜日用之繁,无处不用数学回首往昔数学始终伴随我们左右纵横交错的几何、繁琐复杂的运算难以求解的方程…

log4net日志插件的使用

1、安装log4net2、引用3、配置&#xff08;web.config文件&#xff09;<configSections><section name"log4net" type"log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><log4net><!--信息日志…

源代码提交SOP(Git版)

一、原则1、在维护公共基类、工具类和二方库等可能影响到其他团队成员的代码之前&#xff0c;必须同其他团队成员讨论&#xff0c;达成共识后方可进行维护。2、严格遵守源码签入规范&#xff0c;有助于发现代码漏洞&#xff0c;降低代码合并风险&#xff0c;降低远程仓库代码的…

linux下使用pidcat找bug

第一步&#xff1a; 安装pidcat 第二步&#xff1a; 找到APP的包名比如adb shell ps | grep sangforadb shell pm list package第三步&#xff1a; 在ubuntu终端输入pidcat.py 包名结果&#xff1a;

创建与删除索引

索引是加速查询的主要手段&#xff0c;特别对于涉及多个表的查询更是如此。本节中&#xff0c;将介绍索引的作用、特点&#xff0c;以及创建和删除索引的语法。13.4.1 使用索引优化查询索引是高速定位数据的技术&#xff0c;首先通过一个演示样例来了解其含义及作用&#xff0…

r vector 4 elements_Vector类与Enumeration接口

Vector类用于保存一组对象&#xff0c;由于java不支持动态数组&#xff0c;Vector可以用于实现跟动态数组差不多的功能。如果要将一组对象存放在某种数据结构中&#xff0c;但是不能确定对象的个数时&#xff0c;Vector是一个不错的选择。例&#xff1a;将键盘上输入的一个数字…

JFinal 1.5 发布,JAVA极速WEB+ORM框架

JFinal 爱好者一直都在问 JFinal 何时再次升级&#xff1f;JFinal 1.5 何时发布&#xff1f;以往升级都保持在每月近两次的频率&#xff0c;为何本次五个月过去了新版本还不出&#xff1f;由于作者暂时阔别码坛已有半年时间&#xff0c;一直无暇顾及&#xff0c;现趁此国庆假期…

[深入JUnit] 测试运行的入口

阅读前提 了解JUnit 对JUnit的内部实现有兴趣 不妨看看[深入JUnit] Before, After, Test的秘密] 代码版本: junit 4.12代码搜索工具&#xff1a; http://grepcode.com/常用符号 _: 用来略去代码段中无关紧要的parameter ...: 用来略去无关紧要的代码实现 本文的展开方式&…

.NET6之MiniAPI(七):中间件

http协议&#xff0c;是由客户端发出请求&#xff0c;服务端响应结果并返回&#xff0c;我们把这个请求来回抽象成一个请求管道&#xff0c;那中间件就是这个管道上的阀门&#xff0c;控制着流量的进出和中断。每一个请求都要经过中间件的过滤&#xff0c;滤掉不合格的请求&…

linux之telnet命令使用

telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的 能力。在终端使用者的电脑上使用telnet程序&…

arraylist从大到小排序_经典排序方法的python实现和复杂度分析

1.冒泡排序:冒泡排序算法的运作如下&#xff1a;比较相邻的元素。如果第一个比第二个大(升序)&#xff0c;就交换他们两个。对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。这步做完后&#xff0c;最后的元素会是最大的数。针对所有的元素重复以上的步…

AfxMessageBox和MessageBox差别

假设用MFC的话&#xff0c;请尽量使用afxmessagebox&#xff0c;由于这个全局的对话框最安全&#xff0c;也最方便。 可是在WIN32 SDK的情况下仅仅能使用MESSAGEBOX。 MessageBox()是Win32API函数.后者是mfc中的全局函数&#xff0e;在MFC中能用MessageBox()的地方都能用AfxM…

[单刷 APUE 系列] 第十四章——高级 I/O

非阻塞I/O 在最前面&#xff0c;我们讲过IO分成带缓冲的IO和不带缓冲的IO&#xff0c;但是实际上&#xff0c;这个区别并不是很大&#xff0c;因为缓冲区并没有影响到实际的读写。我们知道&#xff0c;系统调用实际上分成两种&#xff0c;高速的系统调用和低速的系统调用&#…