使用洗牌算法生成随机序列

【C语言->数据结构与算法】->洗牌算法->如何生成一组不重复的随机数 洗牌算法Ⅰ 洗牌算法介绍Ⅱ 如何生成范围内的随机数A. srand()B. rand()C. time()D. 如何将随机数控制在一定范围内E. 生成一定范围内的随机数的代码实现Ⅲ 洗牌算法思想Ⅳ 洗牌算法的代码实现 Ⅰ 洗牌算法介绍 洗牌算法应用于我们需要生成一组不重复的全随机数的情况,就像一副牌,我们发出去是不会有重复的,在发之前把这副牌洗了,这样发出去的牌既是不重复的,也是随机的,这就是洗牌... 阅读详情

  假如我们要构造一个取值在1到n之间的n项随机整数序列S,而且有一个可以生成i到j之间的随机整数的函数rand(i, j)。好的,我们可以简单的为序列S的每一项生成一个介于1到n之间的随机整数Si,伪代码如下:

  OK,问题解决。使用这个算法只需要调用n次rand(1, n)。

  现在我们对约束进行扩展,扩展后的序列中不能存在重复的数。我们修改上述算法,让他可以满足新的约束:每当为序列S的某一项Si生成一个随机数时,检测Si是否与Sj( j = 1, 2, 3, ... , i-1 )相等。若相等,则为Si重新生成一个随机数,并重复上述检测,直到Si不与任何的Sj相等。伪代码如下:

  问题再次解决。是吧?且慢,让我们考虑一下这个算法的时间复杂度。取序列长度n为输入规模,判断操作Sj == Si为基本操作,则该算法的时间复杂度为θ(n2)。这个复杂度和求解扩展前问题时θ(n)的复杂度相差太大了。

  问题来了,对于扩展后问题有没有时间复杂度为θ(n)的算法呢?洗牌算法就是救星,该算法使用一个已经存在的序列来生成一个新的随机序列。算法如下,假设S是一个已经存在的序列,该算法结束后S为一个新生成的随机序列。

  该算法依次将S中的每一项与从其后随机挑选的一项交换,来生成新的随机序列,他的时间复杂度为θ(n)。该算法不再需要对重复元素进行的检测,他所需要的就是一个初始序列S。我们可以使用一种简单有效的策略:将S序列初始化为序列1, 2, 3, ... , n。这个初始化的复杂度也为θ(n)。现在我们得到了一个时间复杂度为θ(n)的生成不含有重复元素的随机序列的算法,如下:

  再来看看这两个算法的不同。序列是一个定义域为连续整数的特殊函数。要求序列中的元素不可重复,其实就是要保持这个特殊的函数是单射的。第一种算法需要在引入每一个随机数后检测是否破坏了函数单射的性质。而第二个算法在初始化序列的时候就保证了函数是单射的,又洗牌算法的每一步都不会破坏函数单射的性质,所以这里函数隐含是单射的,并不需要检测。这就是预构造和问题化简的思想。

C#一个简单有效的洗牌算法 <!-- alimama_pid="mm_10249644_1605763_4929893"; alimama_titlecolor="707070"; alimama_descolor ="CCCCCC"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="FFFFFF"; alimama_linkcolor="DADA 阅读详情

相关推荐

JavaScript中的Math.random()和随机种子

这意味着如果我们使用相同的随机种子,那么每次运行代码时生成的随机数序列都将是相同的,这对于调试和测试非常有用。在每次迭代中,我们生成一个介于0和当前索引之间的随机数,并使用该随机数交换当前索引和随机索引处的数组元素。需要注意的是,洗牌算法是一种有效的随机排序算法,它可以确保每个元素在打乱后的数组中均匀分布,并且每个排列都有相同的概率。函数,它接受一个种子作为输入,并使用该种子生成一个介于0和1之间的随机数。函数并传入一个数组,我们可以得到一个随机排序的新数组,并将其打印到控制台。函数并不接受种子参数。

python_bug262的博客 1253

使用洗牌算法生成随机数序列

前几天一个朋友问我如何产生一个范围内的不重复的随机序列,当时google了一下找到了方法,现在决定回顾总结一下. 在.net 中可以使用 Random 类来生成随机数. 但是由于Random类每次生成一个随机数都是一个独立的事件,所以连续几次生成的随机数就会有重复的情况,无法产生一个随机序列. 我们可以用以下代码来做个实验: ?View Code CSHARP private void ...

diaotanluan4788的博客 206

Imatest-Dot Pattern

本文介绍了DotPattern模块测试方法,用于评估相机拍摄点阵图的表现。测试主要关注两点:色彩准确性(是否存在彩色噪点和杂边)和摩尔纹现象。测试步骤包括导入图片、选择分析区域、微调ROI、选择点状图类型和分析保存结果。测试结果包含横向色差、光学畸变和SMIATV畸变等数据,其中0.115%的色差值和0.004度的网格旋转角度表明相机表现良好,但-10.4%的SMIATV畸变显示存在明显桶形畸变。文章还提供了各项指标的具体解读标准。

weixin_64706696的博客 1351

三种洗牌算法shuffle

1. 背景       笔试时,遇到一个算法题:差不多是 在n个不同的数中随机取出不重复的m个数。洗牌算法是将原来的数组进行打散,使原数组的某个数在打散后的数组中的每个位置上等概率的出现,刚好可以解决该问题。2. 洗牌算法       由抽牌、换牌和插牌衍生出三种洗牌算法,其中抽牌和换牌分别对应Fisher-Yates Shuffle和Knuth-Durstenfeld Shhuffle算法。  ...

linus_Robot的博客 9万+

EtherCAT同步模式实战:如何用TwinCAT配置DC-Synchronous模式(附时序图详解)

本文详细解析了如何在TwinCAT环境中配置EtherCAT的DC-Synchronous同步模式,实现纳秒级同步精度。通过硬件准备、参数配置和高级调优步骤,帮助工程师解决工业自动化中的同步挑战,提升运动控制性能。

gold的博客 1571

番外篇 | 复现HIC-YOLOv5,助力小目标物体的检测

在本文中提出了一种改进的YOLOv5算法:HIC-YOLOv5,用于小目标检测,具有更好的性能和较低的计算成本。🌈

小哥谈 1129

洗牌算法的随机性简单证明。

所谓洗牌算法,就是产生一个包含指定范围的所有数的随机序列。主流的洗牌算法的实现如下:对于N张牌,用大小为N的数组a[N];for(i=0;i&lt;N;i++) x=rand()%(n-i)+i; if(x!=i) swap(a[i],a[x])    我们总是担心他的随机性是否能保证,这里有一个很简单的理解。可以先达成一个共识:如果: 1. 一张牌出现在任何位置的概率是相等的。 ...

Spring_Et的博客 1701

WOFOST作物模型(7):6.0.6版本的PCSE使用(多层水分平衡和SNOMIN碳氮模型的集成)

wofost81文件结构如上,其中所需的参数可从github上获取然后input下有两个需要调用的功能函数py文件,需要拖到自己的运行py文件同级目录下在使用土壤模块SNOMIN进行作物生长模型模拟时,需要为土壤剖面的不同层次提供多种输入变量。这些变量通常不随年份变化,因此会统一在土壤文件中定义。本节将说明如何将这些输入变量整合到一个字典中,进而生成SNOMIN能够读取的土壤文件。

所有专家都曾始于新手 637

随机洗牌算法复杂度的比较实例

这篇博文是意外事件哈,算是有感而发。 在我前段时间,和网友讨论关于随机洗牌算法的过程中,写了两篇博文。 《我以前用过的一个洗牌算法》http://tonyxiaohome.blog.51cto.com/925273/302220 《和一个网友关于随机洗牌算法的讨论》http://tonyxiaohome.blog.51cto.com/925273/311861 这引发了很多讨论,这不,网友...

weixin_34050519的博客 250

RK3588芯片:ALSA音频通路下HDMI与耳机自动切换的技术探索

摘要:本文详细探讨了基于RK3588芯片的HDMI与耳机自动切换方案。文章首先剖析了ALSA音频架构的核心组件与工作原理,接着介绍了RK3588芯片的硬件特性及音频处理优势。重点阐述了自动切换的实现原理,包括硬件检测机制、ALSA驱动处理逻辑和软件控制流程,并提供了详细的配置步骤。同时针对常见问题如切换异常、音频质量下降等给出了解决方案。该方案通过合理配置设备树和ALSA文件,实现了音频输出的智能切换,提升了用户体验,展现了RK3588在音频处理领域的强大性能。未来随着AI音频技术的发展,该方案在智能家居、

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 266

基于Dijkstra算法的共享单车调度优化系统设计与实现

根据最新统计数据,全球共享单车市场规模已超过300亿美元,中国作为最大的共享单车市场,日订单量超过5000万次。Dijkstra算法由荷兰计算机科学家Edsger W. Dijkstra于1956年提出,用于解决带权有向图中的单源最短路径问题。本文详细介绍了基于Dijkstra算法的共享单车调度优化系统的设计与实现。本文将详细介绍基于Dijkstra算法的共享单车调度优化系统的设计与实现,采用Java 17、Spring Boot 3.x等最新技术栈。

2201_76125393的博客 618

公平洗牌算法

文章目录1. c++ 库函数 rand() 以及 srand() 的使用2. 公平洗牌算法 1. c++ 库函数 rand() 以及 srand() 的使用 使用rand()和srand()必须引入头文件#include <cstdlib> 基本用法:randomnNum = rand(),但实际是伪随机,该算法需要一个起始值,称为种子,以生成数字。如果没有给出一个种子,那么它...

Zheng_Ze_qi的博客 490

通信算法之320:DJI无人机云哨--信息包类型

大疆DJI无人机的云哨信息包主要分为四种类型:1)含经纬度位置、型号及序列号的完整数据包;2)仅含序列号的简化数据包;3)完全加密的数据包;4)加密密钥包。这些信息包格式不同,解析方式和应用场景也各异。如需更详细的技术资料,可联系作者获取。

leegang12的专栏 759

随机数洗牌算法

将1到100这个100个自然数,随机放入一个长度为100的int数组中,并且不能重复思路提醒:先按照顺序把1到100放到数组中,然后重复下面100次“生成两个随机位置i和j,然后交换这两个位置的元素”,这叫“洗牌算法”代码实现:        static void Main(string[] args)        {            //随机数洗牌算法            int[]...

ASDTP的博客 641

MicroCap声学仿真介绍(三)-人耳的频率响应

这里需要注意的是,24mm我们会填为”24m”,这里的“m”是毫的意思,24m意思是24e-3,同理7.4mm我们可以填为7.4m,意思是7.4e-3。MicroCap声学库中,已内置“声源”模块和“管”模块,我们需要调用这两个模块,并用连接线将这两个模块连接到一起,完成仿真工作。上图中第一个图是在管的一端输入1Pa(94dBSPL)的信号,管的另一端的不同频率的声压大小的仿真结果。上述的结果跟我们的常识也是符合的。换言之,我们要仿真的目的是在管的一端加1pa的声压时,管的另一端不同频率下的声压分布。

山无忧的博客 1471

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

随机输出一组数字 (洗牌算法)

要求高效。时间上高效必然是空间上换来的,思路关键为: boolean[] nm = new boolean[100]; 将出现过的数字在数组中做下标记。时间复杂度为 O(n)代码如下:public class NoRepeatNum { public static void main(String[] args) {  int[] num = create(100);  for(int i : num)    System.out.print(i + " ");  System.out.println();

LiuStan的专栏 1225

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C算法——生成牌 洗牌算法

【代码】C算法——生成牌 洗牌算法。

小象的个人博客 338

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

洗牌算法

洗牌即产生指定数据的随机序列第一种思路:将54个数依次放到随机的位置。关键是每次找一个随机的位置。下面是找这个随机位置的算法: 1、用一个Bool型数组记录各个位置是否已经放置了数,如果放置则置true,没有则为false。在算法开始时数组初始化为false。2、每次产生一个0~53的随机数,看这个位置是否已经放置了数,如果已经放置了,则继续用同样的方法找一个随机位置判断;如果

飞不高的小鸟 799

实现简单shuffle 洗牌算法

比如说给一个函数,参数是k,要求生成1-k的随机序列。 那么我的做法是先将nums置为1-k,再使用洗牌算法,将序列打乱。 vector<int> shuffle(int k) { vector<int> nums; for(int i = 0;i<k;++i) nums.push_back(i+1); //洗牌 for(int i=nums.siz...

qq_35429629的博客 417

java 8位 不重复_生成8位随机不重复的数字编号的方法

复制代码 代码如下:package com.jjinfo.common.util;import java.util.Arrays;import java.util.Random;/****/public class RandomNumberGenerator {/*** 这是典型的随机洗牌算法。* 流程是从备选数组中选择一个放入目标数组中,将选取的数组从备选数组移除(放至最后,并缩小选择区域)* ...

weixin_34246598的博客 2478

生成8位随机不重复的数字编号

package com.jjinfo.common.util; import java.util.Arrays; import java.util.Random; /** * */ public class RandomNumberGenerator { /** * 这是典型的随机洗牌算法。 * 流程是从备选数组中选择一个放入目标数组中,...

phantomes的专栏 669

C/C++随机数、随机洗牌

1、获取不同的随机数 ①输出不同随机数 srand(time(NULL)); for(int i=0;i<10;i++) { printf("%d ",rand()); } 每次启动程序的时间不一样,保证使用不同的种子,从而使每次for循环打印的10个数都不相同 修改成如下: int data[10] = { 12, 98, 9, 89, 8, 878, 87,...

qq_20386411的博客 812

Java生成不重复随机数

java实现如何生成不重复的随机数 | 浏览:252 | 更新:2015-01-12 13:50 在开发中常常会遇到要生成随机数,要求不重复并且效率又高,怎么实现呢,自己的一些算法设计分享给大家。以生成8位数的随机值为例: import java.util.Random; public class RadomUtil { ...

wangqs1984的博客 682
上一篇: gcc/g++参数详解
下一篇: 数
AlwaysSLH
博客等级 码龄20年 63粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值