# 洗牌算法

2023-10-27

基本概念

等概率将将一个数组N打乱,概率每次都是1/N,加上

方法一

全局洗牌, 从 0到N-1的数组下标,每次随机产生两个0到 N-1之间的数,进行交换

void get_rand_number(int array[], int length)
{
	int index;
	int value;
	int median;
 
	if(NULL == array || 0 == length)
		return ;
 
	/* 每次发牌的时候任意分配待交换的数据 */
	for(index = 0; index < length; index ++){
		value = rand() % length;
 (在这里要取余数,主要是     )
		median = array[index];
		array[index] = array[value];
		array[value] = median;
	}
## j

局限性

多次重复洗牌,

Knuth Shuffle洗牌算法

局部洗牌, 从比如选定位置N-1,随机产生0到N-2之间的一个数,将下标为该数的值与N-1上面的位置进行交换(只考虑为洗好的牌)
,N-1位置上面的数就洗好了,洗一次就不考虑
for i 从 N-1 到 1,
随机数 0到 i(可以等于i) 随机产生一个数 j
交换i和j之间连个鬼数

首先我们生成一个大小为54的数组,数组排列为1~54
a)同样,首先我们生成一个大小为54的数组,数组排列为1~54
b)索引牌从1开始,到54结束。这一次索引牌只和剩下还没有洗的牌进行交换, value = index + rand() %(54 - index
c)等到所有的索引牌都洗好之后,一副牌就弄好了

void get_rand_number(int array[], int length)
{
	int index;
	int value;
	int median;
	
	if(NULL == array || 0 == length)
		return ;
	
	/* 发牌的时候对于已经分配的数据不再修改 */
	for(index = 0; index < length; index ++){
		value = index + rand() % (length - index);
		
		median = array[index];
		array[index] = array[value];
		array[value] = median;
	}
}

Knuth Shuffle

每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度从 Fisher 算法的 O(n2)提升到了 O(n)

选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经确定
选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
重复第 1 2 步,直到剩下1个元素为止

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

# 洗牌算法 的相关文章

随机推荐

  • cgic: CGI的C函数库

    下载回源码包以后 就3个文件 cgic c 函数库capture c 一个很简单的CGI例子 仅仅输出两行提示文字cgictest c 一个演示读取form表单数据的CGI例子 首先在vc6里创建一个空的win32静态库cgic 然后添加c
  • JPG&PNG图片压缩java实现

    最近项目中有一个需求是关于图片处理的 其实关于图片处理java的BufferedImage类基本上已经可以处理绝大多数需求 但是关于png图片的压缩遇到一点小的阻碍 我们知道png图片与JPG图片最大的区别就是可以保存为透明背景的图片 JP
  • 【软件开发】服务端高并发分布式架构演进之路

    服务端高并发分布式架构演进之路 本文以淘宝作为例子 介绍从一百个到千万级并发情况下服务端的架构的演进过程 同时列举出每个演进阶段会遇到的相关技术 让大家对架构的演进有一个整体的认知 文章最后汇总了一些架构设计的原则 在介绍架构之前 为了避免
  • Shell编程(四)---Shell内建命令简介

    命令 我们从一个Shell脚本的内部执行两种类型的命令 也就是通常 normal 的命令 这样的命令我们也可以在命令行的方式下来运行 称为处部命令 另一种就是我们前面所说的内建 built in 命令 称之为内部命令 内建命令是在Shell
  • 32个Python爬虫实战项目,满足你的项目慌

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 爬虫项目名称及简介 一些项目名称涉及企业名词 小编用拼写代替 1 WechatSogou weixin公众号爬虫 基于weixin公众号爬虫接口 可以扩展成其他搜索引擎的爬
  • matlab 二元函数的极限,利用MATLAB软件求解一元和二元函数的极值

    CourseEducationResearch课程教育研究 2018 年第 40 期 利用 MATLAB 软件求解一元和二元函数的极值 易 强 吕希元 重庆工商大学融智学院 重庆 400030 摘要 本文主要介绍利用 MATLAB 软件在电
  • Unity3d-简单AR游戏

    Unity3d 简单AR游戏 一 图片识别与建模 Vufria模块的导入 首先是安装Vuforia 模块 2017版本后的可以直接使用Unity Hub安装 安装完成后可以直接在软件中使用 然后在菜单目录的GameObject gt Vuf
  • java8中的lambda表达式,看这篇就够了

    Lambda表达式 Lambda是简洁的标识可传递匿名函数的一种方式 互动 事件驱动下 最终面向对象编程和函数式编程结合才是趋势 java中 一段代码的传递并不容易 因为JAVA是面向对象的语言 如果要传递一段代码 必须先构建类 再生成对应
  • 在java里actionPerformed是做什么用的

    public void actionPerformed ActionEvent e 这是接口ActionListener里面定义的一个抽象方法 所有实现这个接口的类都要重写这个方法 一般情况下 这是在编写GUI程序时 组件发生 有意义 的事
  • 1.1 波士顿房价预测

    文章目录 一 问题分析 1 1 线性回归模型 1 2 五步法 二 数据处理 2 1 数据导入 2 2 数据形状变换 2 3 数据集划分 2 4 数据归一化处理 2 5 封装成load data函数 2 6 获取归一化后的训练集和测试集 三
  • 数据挖掘的一般过程(小白的学习加实践记录)

    数据挖掘的过程 虽然很早确定了研究任务 从网络数据获取 地理实体数据集成与处理 分析挖掘 制图或知识表达的思路来开展这方面的研究工作 分析挖掘如文本挖掘 空间关联分析 空间趋势分析 空间分布分析 空间聚类 空间分类分析等等 奈何上学期我一学
  • 61_Pandas中将列表存储和处理为 pandas 中的元素

    61 Pandas中将列表存储和处理为 pandas 中的元素 作为 pandas DataFrame 的一个元素 Series 你可以存储列表 这是 Python 的内置类型 例如 对于由分隔符分隔的字符串 列出它们可能比用字符串方法处理
  • Python语法--变量及数据类型(4)

    1 变量 1 1定义 顾名思义 即变化的量 可以重复使用并且可以随时进行修改 相当于 容器 1 2作用 用来存储数据 1 3使用 定义变量的语法 变量名 变量值 定义变量后可以使用变量名来访问变量值 变量本身没有类型 与它保存的数据的数据类
  • mysql中cmake常用参数说明

    mysql Mysql从5 5开始 源代码安装将原来的configure改为cmake 因此在安装mysql 5 5 x时 需要先安装cmake 可以通过源码安装 也可以通过apt get软件包安装 在用cmake配置mysql过程中 找到
  • 实时音频编解码之六 LTP长时预测

    本文谢绝任何形式转载 谢谢 1 4 6 LTP LPC方法的压缩率比较高 但是音质不高 只用LPC方法的编解码语音具有 机器音 的特征 这是由于LPC系数阶数通常取10 20点 这一长度包含了共振峰信息但并不足以囊括所有的基频周期 且LPC
  • Flutter组件学习(20)可滚动组件以及ScrollController监听

    介绍 ViewPort视口 在很多布局系统中都有ViewPort的概念 在Flutter中 术语ViewPort 视口 如无特别说明 则是指一个Widget的实际显示区域 例如 一个ListView的显示区域高度是800像素 虽然其列表项总
  • 联想电脑如何打开BIOS并开启虚拟化——以G50为例

    不少初学者学习Linux等操作系统时 总会遇到新建的虚拟机无法打开 或者是在VirtualBox选择版本的时候发现没有64 bit选项 这些都说明你的电脑没有开启CPU虚拟化 那么如何查看CPU虚拟化是否开启呢 首先第一步 在任务栏上的空白
  • 浮动和清除浮动

    浮动 非IE浏览器下 容器不设高度 且子元素浮动时 容器高度不能被内容撑开 此时 内容会溢出到容器外面而影响布局 这种现象被称为浮动 溢出 浮动元素脱离文档流 不占据空间 引起 高度塌陷 div class father div class
  • Allegro如何导入dxf文件

    以上的操作就将dxf导入到了allegro中 将板框从dxf层改到outliine层 1 选择Edit Change 2 设置Find和Options 3 选择板框 即将dxf层改到outliine层 4 修改outline的颜色 可以看的
  • # 洗牌算法

    基本概念 等概率将将一个数组N打乱 概率每次都是1 N 加上 方法一 全局洗牌 从 0到N 1的数组下标 每次随机产生两个0到 N 1之间的数 进行交换 void get rand number int array int length i