带用排序算法random shuffle讲解

简介: 带用排序算法random shuffle讲解

带用排序算法中的随机洗牌(Random Shuffle)通常指的是对一个序列进行随机排列,使得序列中的每个元素都有可能出现在任何位置,且每个位置上的元素都是随机的。这种算法在很多场合都很有用,比如洗牌游戏、随机抽样等。下面将详细讲解随机洗牌算法的原理、代码实现,并给出相应的解释。

 

算法原理

随机洗牌算法通常基于Fisher-Yates(也称为Knuth)洗牌算法,这是一种简单且高效的洗牌算法。该算法通过遍历序列,并在每一步中随机选择一个尚未洗牌的位置,然后将当前位置的元素与那个随机位置上的元素交换。这样,每个元素都有机会被放到序列的任何位置,从而实现了随机性。

 

代码实现

以下是使用C++实现的Fisher-Yates洗牌算法:

image.png

image.png

代码讲解

包含头文件:

<iostream>:用于输入输出。

<vector>:用于使用动态数组。

<algorithm>:包含std::swap函数,用于交换两个元素。

<random>:包含随机数生成相关的类和函数。

<ctime>:用于初始化随机数生成器的种子。

randomShuffle函数:

使用std::random_device来生成一个非确定性种子,然后用这个种子初始化std::mt19937随机数生成器。

std::uniform_int_distribution<>用于生成在指定范围内的均匀分布的随机数。

从数组的末尾开始向前遍历,对于每个位置i,生成一个随机数j(范围在[0, i]之间)。

使用std::swap交换arr[i]和arr[j]。

main函数:

初始化一个包含整数的向量arr。

输出原始数组。

调用randomShuffle函数打乱数组顺序。

输出打乱后的数组。

性能分析

Fisher-Yates洗牌算法的时间复杂度是O(n),其中n是序列的长度。这是因为算法只需要遍历序列一次,并在每一步中进行常数次操作(主要是交换操作)。空间复杂度是O(1),因为算法只需要常量级别的额外空间来存储临时变量和随机数生成器的状态。

 

注意事项

在实际应用中,为了避免每次运行程序时得到相同的随机序列(尤其是在种子未正确初始化的情况下),通常使用当前时间或其他非确定性数据源来初始化随机数生成器的种子。

如果需要可重复的随机序列(例如在调试或测试中),可以使用固定的种子来初始化随机数生成器。

在多线程环境中,需要确保每个线程使用不同的随机数生成器实例,以避免竞态条件。

总结

随机洗牌算法是处理序列数据的一种常见技术,Fisher-Yates算法提供了一种高效且简单的方式来实现这一功能。通过理解其工作原理和正确实现,我们可以轻松地在程序中引入随机性,以满足各种应用需求。

目录
相关文章
|
算法 安全 量子技术
【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
336 0
|
6月前
|
存储 分布式计算 算法
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
93 0
|
算法 开发者 索引
【C++11算法】random_shuffle和shuffle
【C++11算法】random_shuffle和shuffle
300 0
|
Web App开发 算法 JavaScript
JS中数组随机排序实现(原地算法sort/shuffle算法)
JS中数组随机排序实现(原地算法sort/shuffle算法)
296 1
JS中数组随机排序实现(原地算法sort/shuffle算法)
|
算法 5G 调度
m虚拟MIMO系统的配对调度算法的matlab仿真,对比Random配对,Orthogonal配对以及Deteminant配对
m虚拟MIMO系统的配对调度算法的matlab仿真,对比Random配对,Orthogonal配对以及Deteminant配对
127 0
m虚拟MIMO系统的配对调度算法的matlab仿真,对比Random配对,Orthogonal配对以及Deteminant配对
|
算法 安全 PHP
【高级软件实习】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算法 | Python Random 模块
本篇博客将介绍经典的伪随机数生成算法,我们将 重点讲解 LCG(线性同余发生器) 算法与马特赛特旋转算法,在此基础上顺带介绍 Python 的 random 模块。 本篇博客还带有练习,无聊到喷水的练习,咳咳…… 学完前面的内容你就会了解到 Python 的 Random 模块的随机数生成的实现,是基于马特赛特旋转算法的,比如 random_uniform 函数。而本篇博客提供的练习会让你实现一个基于 LCG 算法的random_uniform,个人认为还是比较有意思的
559 0
【高级软件实习】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算法 | Python Random 模块
|
算法 数据可视化 JavaScript
随机打乱数组及Fisher–Yates shuffle算法详解
介绍几种随机打乱数组的方法,及其利弊。
358 0
|
机器学习/深度学习 算法 前端开发
Machine Learning | (8) Scikit-learn的分类器算法-随机森林(Random Forest)
Machine Learning | (8) Scikit-learn的分类器算法-随机森林(Random Forest)
260 0
|
机器学习/深度学习 算法 数据挖掘
机器学习算法 --- Pruning (decision trees) & Random Forest Algorithm
一、Table for Content   在之前的文章中我们介绍了Decision Trees Agorithms,然而这个学习算法有一个很大的弊端,就是很容易出现Overfitting,为了解决此问题人们找到了一种方法,就是对Decision Trees 进行 Pruning(剪枝)操作。
1887 0