出数据

本文介绍了ACM竞赛中题目数据生成的基本方法,包括随机生成法和手动法。通过使用随机函数rand()和srand(),可以生成指定范围内的随机数。此外,还提供了生成随机数据的具体代码示例。

ACM竞赛中题目的数据一般都可以用随机生成法+手动法。随机生成法主要用到随机函数rand().
int rand(void);
返回一个伪随机数a,a的取值范围是[0,RAND_MAX]。每次调用rand函数,都会返回内部算法生成的看似
不相关的一连串的数。该算法使用随机种子,随机种子的值可以用srand()函数初始化。
RAND_MAX是<cstdlib>头文件里定义的常量, 其值为32767.
例:生成范围是[a,b]的一个随机数,其中a > -1 , b < 32768.


  
int value;
srand();
value
= rand() % (a - b + 1 ) + b;

如果要生成有负数的随机数,可以减去一个常数。
如果要生成64位的数,两个32位的随机数相乘。
类似的,可以根据情况而做相应的变换。
如果数据对象是字符串,大可以找一些英文文章。
总之呢,随机数的方法只是一个基本方法,数据的来源可以是很广泛的,这要根据你题目的需要而定。

当然,测试数据要尽可能的hack掉不正确的程序,所以出题人要尽可能的考虑到每一个边角数据,而边角数据
主要是手动法了。

下面看个实例:

HDOJ-2096

先写数据生成程序:


  
#include < stdio.h >
#include
< time.h >
#include
< stdlib.h >

int main()
{
int a, t = 100 ;
freopen(
" in.txt " , " w " , stdout); // 打开文件in.txt,进行写操作,这样printf()输出的信息将保存在文件里。

/* initialize random seed: */
srand(time(NULL));
a
= rand();
printf(
" %d\n " , t);
while (t -- ) {
a
= rand();
printf(
" %d " , a);
a
= rand();
printf(
" %d\n " , a);
}
return 0 ;
}

然后用正确的解题程序(或称为标程),运行数据,并生成输出文件out.txt


  
#include " stdio.h "

int main() {
// 打开输入输出文件
freopen( " in.txt " , " r " , stdin);
freopen(
" out.txt " , " w " , stdout);
// 代码部分
int a, b, sum;
int n;
scanf(
" %d " , & n);
while (n -- ) {
sum
= 0 ;
scanf(
" %d %d " , & a, & b);
if (a >= 100 ) a %= 100 ;
if (b >= 100 ) b %= 100 ;
sum
= a + b;
if (sum >= 100 )
sum
%= 100 ;
printf(
" %d\n " , sum);
}
return 0 ;
}

转载于:https://www.cnblogs.com/superbin/archive/2011/03/27/1997089.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值