不重复随机数问题

生成不重复随机数的方法 --抽奖问题等 问题描述: 给定一个n,一个m 要求在1 ~ n这n个数字中,生成m个不重复的随机数。 思路: 生成随机数大家都知道,C++中也提供了相关的函数——rand()。 但是问题中要求生成的是无重复的随机数,这里就需要对生成的随机数进行去重操作了。 首选最直观的思路是可以使用set,利用set的无重复的性质对数字进行过滤。 算法如下: while (s.size() <... 阅读详情

来源:csdn(周公的专栏)

好了,我现在开始本篇的讲述。本篇的最原始形态是来源于我早年做的一个Java SE应用软件,它是用来模拟彩票投注站的选好软件的。应为在早年Java SE中用swing做界面布局是一件比较痛苦的事情,所以后来我重新用C#做了一个。这个问题的原型就是解决双色球随机选号的问题,我们知道双色球红色球共包含1到33这33个红色号码球及1到16这16个蓝色号码球,一注双色球号码应包括6个红色球号码和1个蓝色球号码。蓝色号码球很好解决,随机从1到16这16个数字中随机选取一个就行了。但是红色球就存在这样一样问题,每次选取的红色球不能与本注中已经选取的号码重复,这个问题归结为生成不重复随机数问题。

在本篇我就怎么生成不重复的红色球展开讨论。

解题思路一

在早期的Java中不包含泛型,只能使用ArrayList,所以我是用ArrayList来实现的。在Java中的ArrayList和C#中的ArrayList在用法上是很相似的(这就是为什么高手经常说掌握一门语言之后再去掌握另一门语言是很容易的事情,应为思想是相通的,呵呵)。在这里我最想想到的就是使用循环,每次循环中随机生成一个随机数,判断一下这个随机数是否已经在本注中使用,如果没有使用就将这个号码保存到结果中去,反之则进行下一轮循环,循环的结束条件就是生成了满足要求的6个数字。接触到泛型之后,我知道在这里我所使用的数据类型是int类型(当然也可以使用byte类型),如果使用ArrayList保存int这样的值类型数据会存在着装箱和拆箱操作,带来不必要的性能损失,所以针对这种集合中数据类型单一的情况可以考虑泛型集合。

当然,上面这种思路是可以实现的,但是每次随机生成一个随机数都要判断在结果集合中是否已经存在这个数,如果存在还要继续下一个循环,这样一来并不是每一轮循环都能生成一个有效(即不重复)的随机数,并且result.Contains(temp)尽管看起来只有一句,但实际在内部还是要通过循环来判断,效率还是较低。假如有一天有个人看到这篇文章,他想:很好,我终于可以试试了,我要从1到10000个数中取出9999个不重复的随机数,用上面的这个方法,可能很长时间都得不到结果(不要以为没有这样的人,我就遇见多多次不会变通的人,实际上最好的解决办法就是从10000中随机去掉一个就可以了,而不是照搬上面的套路)。

解题思路二

刚才说到在方法一中并不是每一轮循环都能生成一个有效的、不重复的随机数,那么有没有这样的办法,保证每一轮循环都能生成一个有效地、不重复的随机数呢?答案是有的。

具体做法是这样的,我们将初始化一个容器集合,在这个容器集合中包含了所有可能的值,然后每次随机从这个容器集合中随机选取一个值保存到结果集合中去,之后我们就从容器集合中将这个已经使用过的值删除掉,然后再进行下一轮的循环。既然都已经从容器集合中删除掉了,自然在下一轮循环中随机从容器集合中取一个值,这个值自然不会重复了。因为这个集合的容量是可变的,那么自然也是使用泛型集合了。

 

 

经过这么一改动,确实能做到每次循环都能生成一个唯一的有效的不重复的数,这样一来就能做到在M个数中选取N个数时只需要循环M×N次就可以了(M>N,并且都是正整数)。不过也有人会说,我现在还在维护一个.NET1.1的项目,我这里也有类似的需求,可是在.NET2.0以下版本中是没有泛型的,你能给我想个办法吗?我的答案是可以的。

解题方法三

在这个方法中我们不适用泛型集合,只使用数组,这样一来这种做法就可以适用于C、Java、PHP等语言和.NET1.1中了。

思路如下,首先使用一个数组作为存储所有可能值的容器集合,然后通过循环每次生成一个随机值,这个值将来会作为下标来访问容器集合中的数值。因为数组是不可变集合,我们不能将已经使用数值从数组中删除,并且它们是简单的数据类型我们不可能给每个数值增加一个属性表示数值是否已经被使用过了,那该怎么办呢?办法就是每次从可用的下标集合中随机生成一个值,然后以这个值作为索引从容器集合中得到相应的值保存到结果集合中,除此之外再将这个已经使用过的值与数组中最后一个没有使用到的值互换位置,然后下一轮再在所有没有使用过的值中重新再取一个值。

 

 

这样一来,问题得到了解决了。这种做法也可以移植到不支持泛型的版本或者语言当中。

再来一点变动

上面我们处理的都是连续的情况,假如万一让我们在不连续的集合中随机选择5个不重复的,比如在某个班50个学生中随机抽取5个学生来,貌似上面的做法不行了?其实不然,依然可以沿用这种思路,比如使用上面的第三种办法即GenerateNumber3(),无非就是声明一个字符串数组,在这个字符串数组中存放全班所有同学的姓名,然后按照下标来随机取5个姓名即可(具体代码这里省略)。

不过对这种情况还有不同的,比如在快女和春晚中都有短信投票的环节,最后会从所有发送短信的手机号中随机抽取几个手机号码作为中奖号码(为了简化,将一号多投的情况视作一次,并且假设没有廉租房“连号”的“公平”情况),可能有人会想到照搬上面的情况。实际上在这种情况下不适合,有可能随机数的集合相当大,这样就不适合在内存中存储了,可以考虑使用数据库存储然后利用数据库的随机函数,在不同的数据库中取随机记录的函数可能会不同。比如在MySQL中如下(假设表名为table_name):

select * from `table_name` order by rand() limit 0,10

而在SQL Server中会是如下(假设表名为table_name):

select top 10 * from [table_name] order by newid()

至于在Oracle中如何随机抽取记录,大家google一下吧。

当然,这个情况还可以再复杂一下,可能电视台针对短信参与的用户要分一二三等奖,一等奖1名,二等奖2名,三等奖3名,纪念奖50名,那么情况就会稍微再复杂一点,不过也就是再增加一个字段而已,这个字段表示当前的号码是否已经中过奖,每次选取号码时只选择那些未曾中奖过的号码即可。

 

 

BAT面试题——海量整数,找出不重复整数 欢迎关注,敬请点赞! 文章目录构建测试数据方法一(内存充足):用python字典结构:方法二(内存不足):用bool数组:总结: 海量数据时代,不是谁都可以一口闷。 题目:在2.5亿个整数中,找出不重复的整数(注,内存不足以容纳这2.5亿个整数)。 构建测试数据 返回顶部 # 构建一个测试数据集:随机生成10000个(-20000, 20000)的整数,以字符串格式存入bigdata中 import random for i in range(10000): with open('bigdata', 'a') as file: file.write(str(rand 立即下载

相关推荐

Modkit

Nmod- 通过过滤器分类为具有指定碱基修饰的残基的调用数量。Ncanonical- 通过过滤器分类为未修饰的碱基的调用数量。确切的碱基必须通过修饰代码推断。例如,如果修饰代码是m(5mC),则未修饰的碱基是胞嘧啶。如果修饰代码是a,则未修饰的碱基是腺苷。Nother mod- 通过过滤器分类为修饰的调用数量,但修饰不同于列出的碱基(且相应的未修饰碱基相同)。例如,对于给定的胞嘧啶,可能有 3 个读取带有h调用,1 个带有未修饰调用,2 个带有m调用。在h的 bedMethyl 行中,N。

生物信息学 1265

C#的解题思路(1):不重复随机数的产生问题

关于不重复随机数生成的问题我在七八年前就遇到过,四五年前的时候曾经做过总结,最近看到有人在讨论这个问题,于是就又重新捡起这个话题了。现在捡起这个话题的目的不是想再简单介绍可能的几种算法,而是从思路上去说明,并且将情况慢慢复杂化,想要说明的是程序员们(不限于.NET程序员)不要用固定的思路去解决问题,可能同样的要求在不同的场合下会有不同的做法。明白了思路才能真正做到以不变应万变,学会一两个控件的用法或者多指导一两个API并不算什么本领,能够在遇到以前没有碰到过的问题时迅速简化解决思路才是本领,另一种本领就是遇

周公(周金桥)的专栏 1万+

学习C++的递归函数(包含汉诺塔讲解)

简单来讲,递归函数就是函数本身自己调用自己,那么函数又是什么呢?#include <stdio.h> //这行是头文件,不同的头文件可以用不同的函数int main() //这里就是一个main函数//这里是你要编写程序的内容return 0;(这是个小细节如下)所以我们平时用来练习的就是一个main函数,而且是一个整型类型的函数,而这也是最后一句话为什么要加一句 return 0;了,因为它最后要返回整数类型,其它整数也可以,但是大家规定为0,这是C++自带的函数。

2302_81032013的博客 2594

随机不重复数小案例:0-m中取n个不重复数

m+1个数中选n个最优是取n次,每次生成随机数前排除已被选了的数(把已选的数和数组最后一个数交换位置,下次在“随机数组的长度-已选数的次数”中生成随机数)。 0-m(不包含m)中取n个不重复数,n<=m: package com.booy; import java.util.Random; //从0-m(不包含m)中随机生成不重复的n个数,n<=m+1 public class RandomDemo { //从0-99中随机生成10个不重复数 public static voi

java编程学习_java基础教程_booyzhang的博客 540

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4981

【实用运维脚本】Windows 批量 TCP 端口检测(tcping 一键巡检)

摘要:本文介绍一款高效的Windows批量TCP端口检测脚本,适配tcpingv0.39工具,实现多服务器一键巡检。脚本具有进度可视化、双日志输出、自动容错等优势,支持注释行过滤和UTF-8编码。 使用仅需三步: 1)下载tcping工具 2)编辑目标列表 3)运行脚本即可自动检测并生成带编号的检测报告。 该方案解决了手动检测效率低、易遗漏的问题,特别适合日常运维中的端口连通性检查,实测稳定可靠,开箱即用。

蕲士|D365 & 服务器运维,心有东坡,行稳致远。 799

根据随机组卷规则每次随机生成不重复的试题集合

前言:顾名思义,随机组合试卷是区别于固定试卷的,固定试卷里面的题目都是规定好,不会产生变化;而随机组合试卷是事先定义好一套组合的规则,每次根据规则来随机产生不重复的试题组合。 一、背景意义:随机试卷功能的开发有效遏制了考场上作弊的不良风气,也有利于为所有考生提供公平、公正的考试环境,因此随机组卷功能的开发将成为考试界线上考试的一种主流。 二、需求分析:就像前言一样,本人在实际开发过程中开发了固定试卷和随机组卷这两个模块,在随机组卷模块里主要是制定各类型试题组合规则,包括每个类型题目数量多少,每个题目分值

qq_42751248的博客 2637

【代码审计】RuoYi定时任务漏洞:从SQL注入到RCE的攻防演变

本文深入剖析了RuoYi框架定时任务模块从早期版本无校验到引入黑白名单机制,再到被组合利用实现RCE的完整漏洞演变过程。文章详细分析了SQL注入与定时任务功能结合导致的远程代码执行漏洞,并总结了代码审计与安全开发的核心要点,为开发者提供了重要的安全参考。

yellow的专栏 699

解决.net 中随机数重复的方法(防踩坑)

最近出现了几次,同一时刻创建的两个订单的订单No重复了(订单No的逻辑为:时间戳+随机数),时间一样的情况下,时间戳重复是可以理解的,但是随机数最近重复的几率有点不正常,通过排查代码发现,在生成随机数的时候,直接使用的。而这个Random,也可能是大部分使用.net的小伙伴经常用的一个类,怎么解决和避免这么高的重复率的问题呢,可以使用下面的方法来解决。用这个方法,通过遍历的验证的时候,发现,时间差极短的情况下,生成的随机数重复率非常高。

weixin_40704848的博客 659

【已解决】如何在服务器中下载huggingface模型,解决huggingface无法连接

在服务器上使用huggingface模型时,如果直接指定模型名称,用AutoTokenizer.from_pretrained(“model_name”),可能会由于网络原因会报错 Failed to connect to huggingface.co port 443 after 75018 ms: Operation time out因此我们需要下载模型到服务器上,得到模型本地的路径model_dir,再通过AutoTokenizer.from_pretrained(model_dir)方式来使用。

a61022706的博客 4万+

一文读懂 CST 时/频域求解器

本文系统介绍了CST Studio Suite中的关键网格技术——六面体网格、四面体网格以及TLM求解器专用的八叉树非均匀网格技术。重点阐述了六面体网格的三项核心技术:理想边界拟合(PBA)技术可精确处理曲面边界,薄片技术(TST)能高效模拟薄层结构,自适应八叉树网格实现计算资源最优分配。同时详细对比了六面体网格与四面体网格的特点及适用场景,前者适用于系统级EMC/EMI分析等时域问题,后者擅长处理复杂曲面和异质材料的频域问题。

一只豌豆象的博客 465

java获得不重复的随机数_论 Java 中获取一组不重复的随机数之性能问题

今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的.于是上网去找资料, 在网上找到的资料中大部分都是一个思路:网上的思路一:(性能不理想)先生成一个随机数, 然后在生成下一个随机数的时候和以前的随机数进行匹配, 如果里面有当前生成的随机数, 那么重新去生成, 直到之前所生成的随机数组中没有当前所生成的那个数字为止.这样做虽然能实现生成一组不重复的...

weixin_36192410的博客 218

计算机视觉与深度学习 | 2024年至2025年图像匹配算法总结(原理,公式,代码,开源链接)

以上总结覆盖了当前主流和前沿技术,实际选择需结合具体场景(速度/精度/资源限制)评估。

尘世冰封的专栏 1590

取随机数不重复问题

随机数处理数据时一般情况下,取值不定,经常会出现重复的数据,而为了让其不再出现重复现象,可以做如下处理 /*  * 0到10随机数不重复处理,将10改为n则可进行0到n的随机数不重复处理  *   * */ public class TestRandom { Random random = new Random(); int b[] = new int

small_technical的博客 1395

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

不重复的随机数问题

对于随机数的运用,在开发中经常会用到。有时需要生成不重复的定范围定总量的随机数,比如1~20,需要打乱的1~20中的10个数,那到底怎么做呢?

qq_58259539的博客 2481

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

不重复随机数的产生问题

<br />解题思路一<br />在早期的Java中不包含泛型,只能使用ArrayList,所以我是用ArrayList来实现的。在Java中的ArrayList和C#中的ArrayList在用法上是很相似的(这就是为什么高手经常说掌握一门语言之后再去掌握另一门语言是很容易的事情,应为思想是相通的,呵呵)。在这里我最想想到的就是使用循环,每次循环中随机生成一个随机数,判断一下这个随机数是否已经在本注中使用,如果没有使用就将这个号码保存到结果中去,反之则进行下一轮循环,循环的结束条件就是生成了满足要求的6个数

huying_0917的专栏 2860

C# 不重复随机数的产生问题

本篇用来模拟彩票投注站的选好软件的。因为在早年Java SE中用swing做界面布局是一件比较痛苦的事情,所以后来重新用C#做了一个。这个问题的原型就是解决双色球随机选号的问题,我们知道双色球红色球共包含1到33这33个红色号码球及1到16这16个蓝色号码球,一注双色球号码应包括6个红色球号码和1个蓝色球号码。蓝色号码球很好解决,随机从1到16这16个数字中随机选取一个就行了。但是红色球就存在这样

jingdian14 3988

c语言 不重复随机数以及随机数间隔重复问题

写下面的代码时碰到的一些问题 包括生成不重复随机数和随机数相同 买彩票规则:“双色球”每注投注号码由6个红色球号码和1个蓝色球号码组成。 红色球号码从1–33中选择;蓝色球号码从1–16中选择。 重点是生成不重复的随机数。 编写程序:输入想要购买的彩票数z,输出z张彩票 遇到的问题是:生成多张彩票数时,间隔彩票的号码数(生成的随机数)是相同的; 其实是上学期的题,上学期犯得错,拖到现在才想着解决...

田田的博客 2693

javascript 取不重复随机数问题

今天研究了下关于脚本取不重复随机数问题,大致有3个算法. //1.采用sort()排序     function aa()    {        var r = [];        for(var i = 0; i         {            r[i] = i;        }        var   tstart=new   

mators的专栏 757

产生一系列不重复随机数的问题

最近需要考虑一个产生一系列不重复随机数的程序,搜索了一些资料,发现方法不太合意。于是对已有资料进行了总结,并提出自己的一些想法。 问题: 随机数的范围为[1,M] 所需生成个数为N( 要求N个数之间互不相同。 需要注意的是,问题所要求的并不是一个随机序列(或者说,伪随机序列; 此处暂不讨论“真”“伪”随机问题,简单地认为计算机生成的随机数就是所要求的随机数)。随机 序列包含重

oneinmore的专栏 1840

关于 取 多个随机数的不重复问题

每当学到一个知识点,佬湿总是布置 产生多个不同随机数问题,应用于验证码。

DH2Y的全栈修仙路 529

关于生成不重复随机数组的问题?

有时候想测试一些模块的性能,不其然地就想到用机器自动生成一些测试数据来,随机数应该是最常用的一种,今天小弟就用了这种简单的方法,生成了上万个随机数,但是问题随之而来,看看生成的随机数组,当中的相临重复占了一大半,这样的测试用例如果用来测试一些排序模块的话,效果可想而知,看看msdn上面的事例,其中有句比较奇怪的代码,就是在循环中让线程停上一会,我仿照的代码如下:static void Ra

清风阁 2412
上一篇: 有趣的面试题
下一篇: 语录:管理程序员就像放养一群猫
CGambit
博客等级 码龄16年 1粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值