博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不重复随机数生成
阅读量:6216 次
发布时间:2019-06-21

本文共 960 字,大约阅读时间需要 3 分钟。

  在服务器里面需要用到从一组数中随机M个不同的数出来的需要,这种需求实现出来本身不复杂,最简单的就是一直随机,每次随机出来的数字判断是否跟之前有重复,如果没有就加入返回队列中。这种简单的算法在数据源很大,需要随机的数很少的时候,效率还是可以的,而且实现非常简单。但是在数据源本身就很小,而且需要随机的数据量比数据源差不都,那么就可能会发生需要随机多次才能随机出一个和现有随机数不同的数值,那么可能导致算法效率非常低下。

  通过google了一些不同的随机算法之后,结合这个需要本身,针对数组下标替换算法进行了部分修改。主体的算法还是通过随机索引和当前数组的索引进行交换,然后当前索引后移,继续进行随机交换。这个算法需要注意的地方,就是数据源本身在进入算法之前需要按照数据范围进行排序初始化。

  算法实现的代码如下:

1     void GenUniRandVec(vector
& orignVec, uint32_t uOrignSize, uint32_t uNum, vector
& randVec) 2 { 3 if (uNum > uOrignSize) // 超过能随机的范围 4 { 5 return; 6 } 7 8 /* 9 采用数组下标置换的方式,传入的orignVec需要是指定随机范围内数字排序好之后的数组10 如果获得了指定数量的随机值后,算法就终止11 */12 uint32_t uRandCount = 0;13 for (uint32_t i=0; i

  当随机出指定数量的不重复随机数之后,函数就退出。

  这个算法不能用作数量非常大的数据源,会导致orignVec在初始化的时候需要非常长的时间。这种数据量非常大的数据源,就可以直接进行随机,如果发生重复再随机可以。

转载于:https://www.cnblogs.com/chobits/p/4026898.html

你可能感兴趣的文章
小米手机安装fidder证书
查看>>
读《Oracle DBA工作笔记》知识点-获取创建语句
查看>>
IOS操作系统上执行monkey测试
查看>>
读书笔记—CLR via C#线程25-26章节
查看>>
Hybrid设计--离线更新
查看>>
jquery复习笔记
查看>>
IRP三种操作
查看>>
sql--转置
查看>>
XML文件
查看>>
java基础(十四章)
查看>>
python函数
查看>>
wx.createSelectorQuery() 获取节点信息 获取不到解决方法
查看>>
PhoneGap:JS跨域请求
查看>>
ubuntu:安装指法练习工具
查看>>
背包问题(01背包和完全背包)
查看>>
linux的函数库管理
查看>>
Java学习路线图(如何快速学Java)
查看>>
Java 11正式发布,这几个逆天新特性教你写出更牛逼的代码
查看>>
批量添加代码,修改,删除DAL部分
查看>>
Echarts 之二——地市联动数据统计
查看>>