基于实验六对基于时间抽取随机不同数的算法研究

实验报告链接:

https://www.cnblogs.com/nnn13579/p/10992122.html

对于基于时间抽取不同数,容易出现:

这是某位同学的实验结果。

当中使用了这样的语句:

srand((unsigned)time(NULL));

和下面这条是一个效果:

srand((int)time(0));

问题就出在这里。

原因很简单,计算机运算速度很快,精确到秒对于计算机来说太大了。

那么将int改成double是否有效解决呢?

No,除非你用的是Linux系统的php,精确到毫秒。

而且当要抽的量大时,也可能重复。

所以我的第一想法是,当重复时,直接全部重抽好了。

所以有了如下代码:

 1     int k=0;
 2     do{
 3         srand((int)time(0));
 4         for(int i=0;i<n;i++)
 5             luck[i]=rand()%num;
 6         for(int i=0;i<n;i++)
 7             for(int j=i+1;j<n;j++)
 8                 if(luck[i]==luck[j]){
 9                     k=1;break;
10                 }
11     }while(k);

通过检测是否有抽出了相同数来确定是否重抽。

但显然,这种做法效率低下。

于是考虑在抽出相同数时,反复更改抽出的数来确保没有相同数。

于是:

 1 for(int i=0;i<n;i++){
 2     srand((double)time(0));
 3     luck[i]=rand()%num;
 4     int j=0,k=0;
 5     for(;j<i;j++)
 6         if(luck[i]==luck[j]){
 7             k=1;
 8             while(k){
 9                 srand((double)time(0));
10                 luck[i]=rand()%num;
11                 if(luck[i]!=luck[j]) {
12                     int t=0;
13                     for(;t<i;t++)
14                         if(luck[t]==luck[i]) break;
15                     if(t==i) k=0;
16                 }
17             }
18         }
19 }

但是,当抽40人时,起码要40+s,

效率低下的问题依旧没有解决。

那么优化算法,利用C(n)(m)=C(m-n)(m),增添以下内容:

 1  if(n<=num/2||n<=num/2+1){
 2         fun1(luck,n,date,num);
 3         fun2(luck,n);
 4     }
 5     else{
 6         int tluck[num-n];
 7         fun1(tluck,num-n,date,num);
 8         fun2(tluck,num-n);
 9         int tluckn=0,luckn=0;
10         for(int i=0;i<n;i++){
11             while(luckn==tluck[tluckn])
12                 luckn++;
13             luck[i]=luckn;
14             luckn++;
15         }
16     }

fun1()为抽取随机数的函数,fun2()为排序抽取的数。

但这治标不治本。

问题在哪里呢?

出在会抽出重复数。

对于抽n个数,极大可能抽了不止n次。

于是我有了一个想法,把抽过的数全部排除掉,然后在剩下数中抽取。

 1 void fun1(int luck[],int n,int num,int i,int all[]){
 2     if(i<n){
 3         srand((double)time(0));
 4         int t=rand()%num;
 5         luck[i]=all[t];
 6         for(int j=t;j<num-1;j++)
 7             all[j]=all[j+1];
 8         fun1(luck,n,num-1,i+1,all);
 9     }
10 }
11 ……
12 ……
13 ……
14 int all[num];
15 for(int i=0;i<num;i++)
16     all[i]=i;
17 fun1(luck,n,num,0,all);

all[]用于存储所有人的序号,

每个人的序号都有两种,

一种是在班里的序号,

另一种是在数组中的“房间号”。

而我们每次抽的都是房间号。

每次抽一个人后,将这个人踢掉,然后剩下的人一次向前移一个“房间”填补空位,实现房间里的人更新。

之后再用抽剩的人去抽下一轮。

由于

int t=rand()%num;

中,num值一直在变,随机的数也会一直变化,实现刷新。

即便一直抽取同一个“房间”,例如1号房,

但由于房间里的人已经换过了,所以不会是抽出同一人。

经过这次算法优化,能够实现抽n人只需要抽n次,抽取40人的时间压缩到了1s内。

原文地址:https://www.cnblogs.com/nnn13579/p/11006246.html

时间: 2024-10-10 12:35:00

基于实验六对基于时间抽取随机不同数的算法研究的相关文章

吉首大学_编译原理实验题_基于预測方法的语法分析程序的设计【通过代码】

一.实验要求 实验二 基于预測方法的语法分析程序的设计 一.实验目的 了解预測分析器的基本构成及用自顶向下的预測法对表达式进行语法分析的方法,掌握预測语法分析程序的手工构造方法. 二.实验内容 1.了解编译程序的基于预測方法的语法分析过程. 2.依据预測分析原理设计一个基于预測方法的语法分析程序. 三.实验要求 对给定文法G[S]: S->AT       A->BU     T->+AT|$      U->*BU|$    B->(S)|m 当中,$表示空串. 1.推断上

基于Web开发模式的信息抽取

基于Web 开发模式的信息抽取 信息抽取是一个互联网自然语言处理的一个首要环节,信息抽取的准确度会直接影响到后续的处理.信息抽取的目标是去除噪音,获取网页有价值的信息如网页的标题.时间.正文.链接等信息.   主流算法介绍 网页信息抽取的方法有很多,比如从算法上分:基于模板的,基于信息量.基于视觉的.基于语义挖掘的.基于统计的.从HTML 处理上分为:基于行块.基于DOM 树.下面我逐一介绍. 1.     基于模板,一般由人工维护一个URL 和HTML 的模板.当URL 匹配到某个URL 模板

Fragment生命周期-基于实验的最新总结

现在很多应用的开发都是基于FragmentActivity中嵌套Fragment进行开发的,所以,如果我们能够清晰地知道他们的生命周期,那么会使我们的开发变的容易. 对于Activity的生命周期,我在之前的文章 Activity生命周期-基于实验的最新总结  中已经说的很详细了,因此本篇文章只是从实践角度来讲一下Fragment的生命周期以及Fragment与Activity生命周期的对应关系,像大多数介绍Fragment生命周期的文章一样,先上两张图: 好,言归正传 这里从实例的角度来说明一

SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性

原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.具有使用 Microsoft Visual Studio 进行 Microsoft .NET Framework开发的经验. 4.熟悉或了解Microsoft S

20190225 实验:实现基于SSL加密的主从复制

实验:实现基于SSL加密的主从复制实验步骤: 环境:三台主机,一台CA:200,一台master:150 ,一台slave:100平时都是在CA上帮用户生成私钥,在服务器上做的1 CA,master,slave 的证书相关文件mkdir /etc/my.cnf.d/sslcd /etc/my.cnf.d/sslopenssl genrsa 2048 > cakey.pemopenssl req -new -x509 -key cakey.pem -out cacert.pem -days 365

20165309 《网络对抗技术》实验六:信息搜集与漏洞扫描

20165309 <网络对抗技术>实验六:信息搜集与漏洞扫描 1.基础问题回答 (1)哪些组织负责DNS,IP的管理. (2)什么是3R信息. (3)评价下扫描结果的准确性. 2.实践总结与体会 (1)遇到的问题与解决 (2)实验感受 3.实践过程记录 (0)准备工作 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点(以自己主机为目标) (4)漏洞扫描:会扫,会看报告,会查漏洞说明,会修补漏洞(以自己主机为

C++实验六;

Part2 基础练习 Code #include<fstream> #include<string> #include<iostream> using namespace std; int main() { char a[20]="merge sucessfully"; ofstream file("3.txt",ios_base::app); file<<endl; file.write(reinterpret_ca

通用高校排课算法研究----3.基于时间片优先级排课算法

通用高校排课算法研究----3.基于时间片优先级排课算法 3   基于时间片优先级排课算法描述与分析 排课问题实质上是时间.教师.班级.教室.课程这五维关系的冲突问题,要合理的解决这个问题首先要了解排课中的一些基本原则以及排课的一些基本要求. 3.1排课中的基本原则 在课程的编排中应遵循一定的规则, 只有按照基本规则来进行课程的编排才能够减少冲突的发生, 这些基本规则主要有以下几条: 1) 同一班级的学生在同一时间(某些特定的选修课时间除外) 不能安排两门课程 2) 同一教师在同一时间不能安排两

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验六:数码管模块

实验六:数码管模块 有关数码管的驱动,想必读者已经学烂了 ... 不过,作为学习的新仪式,再烂的东西也要温故知新,不然学习就会不健全.黑金开发板上的数码管资源,由始至终都没有改变过,笔者因此由身怀念.为了点亮多位数码管从而显示数字,一般都会采用动态扫描,然而有关动态扫描的信息请怒笔者不再重复.在此,同样也是动态扫描,但我们却用不同的思路去理解. 图6.1 6位数码管. 如图6.1所示,哪里有一排6位数码管,其中包好8位DIG信号还有6位SEL信号.DIG为digit,即俗称的数码管码,如果数码管