Lucky_Glass的程序笔记

第二期:随机数生成器

一些输入数据非常复杂的题目难以自己给出一组输入数据,何不利用编程来给出输入数据呢?这样的随机数生成器应用非常广泛,且针对任意题型都满足。但是用随机数生成器生成的数据并不具有特殊性,可能单次无法给出你的程序输出错误的数据,因此检查时需要调试多次。


一、 随机数基础
C++生成随机数主要是靠 rand() 来实现的,这个函数在头文件 cstdlib 内(可能其他头文件也包含)。所谓“随机数”,其实并不是真正随机的,它是在一个顺序非常杂乱的数字串中找出一个数并返回,尽管有可能重复,但是对于一般的题目是能够给出比较随机的数据的。
要达到真正的随机数就要请教我们的时间函数 time()了,这个函数在头文件 ctime 内。它返回的是一个时间,由于调试时不可能有一个时间是相同的,所以它的返回值随时间的变化也会变化,这就是能够用 time() 函数给出时随机数的原因。使用时我们通常使用 time(NULL)
有了时间函数还不够,我们需要把时间函数的返回值作为种子在 rand() 函数中播种。播种函数用 srand() 函数,也是在 cstdlib 头文件内的。通常用法是 srand(time(NULL))
对于随机数生成器输出的数据,我们需要存储在一个文件里,即文件输入输出(任意方法,作者采用 freopen())。

二、 随机数生成器的编写
根据数据范围,比如变量n是 1<=n<=100 那么我们就需要计算出n 最大和最小值的差再加上1(100,设为m),然后将 rand() 函数的值取余m再加上最小值。由于随机数生成器给出的数据往往特别大,因此我们可以找一个正确程序来“对拍”,当然这样在考试中是不现实的,于是我们可以把数据设小一些,方便观察。

三、 随机数生成器的应用 这里给出一道题——乘积最大

Description
今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:
设有一个长度N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。

Input
第1行:共有2个自然数N,K (6<=N<=40,1<=K<=6)
第2行:一个长度为N的数字串
output
第1行:最大乘积

确定数据后,写程序就非常简单了。
样例程序(不要拿这个数据来测试作者的程序

/*Lucky_Glass*/
#include<cstdlib>
#include<cstdio>
#include<ctime>
int main()
{
    srand(time(NULL));
    freopen("in.txt","w",stdout);
    int n=rand()%35+6,k=rand()%6+1;
    printf("%d %d\n",n,k);
    printf("%d",rand()%9+1); //保证第一位不为0
    for(int i=1;i<n;i++)
        printf("%d",rand()%10); //每一位数分别输出
    return 0;
}

The End

Thanks for reading!

-Lucky_Glass