前缀芝士--随机数
既然要使用对拍,那我们肯定要学会造数据,要是简简单单的数论题,只让你输入一个/两个整数的题,你可以很自然的造上好多组数据,要是图论,树论,你要怎么办呢??
那这里,我来介绍一种利用c++生成随机数的方法吧
//首先是头文件,
#include<cstdlib>
#include<ctime>
#include<cstdio>
第一个cstdlib是随机数的必要文件,我们待会要用的rand,srand都在里面.
第二个ctime是为了应对生成的数够随机.
第三个就是简单的输入输出了
下面才是生产随机数的精髓
int main()
{
srand((unsigned)time(0));//把时间当作一个种子喂进去
....
}
这一步就是我们要用到ctime头文件的原因
我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。
接下来是一些简单的操作
int n=rand()%m;//表示n是一个从0--m-1的一个数
int n=rand()%m+1//n=[1,m];
int n=rand()%(m+1)//n=[0,m];
int n=rand()%100+1;
int m=10000;
for(int i=1;i<=n;i++)
{
a[i]=rand()%m+1;
}//整数序列
for(int i=1;i<=m;i++)
{
int l=rand()%100+1;
int r=rand()%100+1;
if(l>r)
swap(l,r)
}// 整数区间
至于生产图和树吗(这里给出树的生成,图自己去想)
树
for(int i=2;i<=n;i++)
{
int fa=rand()%(i-1)+1;
int val=rand()%100001+1;
printf("%d %d %d",i,fa,val);
}
这就是生成随机数了,也是自己出题的关键,主要是手造数据实在是太慢了!!!
(这才是用来造数据的啊!!!!)