您的位置:首页 > 其它

百度的一道有关随机数按照指定频率输出的题

2012-06-30 20:38 176 查看
输入:N(整数)输入:数据文件A.txt,不超过6条记录,字符串长度不超过15个字节文件格式如下:字符串\t数字\n说明:每行为1条记录;字符串中不含有\t。数字描述的是该字符串的出现概率,小于等于100的整数。多条记录的出现概率之和为100,如果A.txt不满足该条件,程序则退出;如果文件格式错误,程序也退出。要求:编写一个程序,输入为N(正整数),读入文件A.txt,按照字符串出现概率随机地输出字符串,输出N条记录例如:输入文件A.txtabc\t20a\t30de\t50输入为:10即 abc有20%的概率输出,a有30%的概率输出,de有50%的概率输出,输出10条记录以下为一次输出的结果,多次输出的结果可能不相同。abcadedeabcdeadeade题目解析:这个题目其实考察了很多,随机数生成的问题,文件访问的问题,二者中有很多小细节容易让我们忽略的。但是最巧妙的考点是如何按照指定的概率输出。为此我指定了一个数组number[10],number[i]用于存放字符串i的输出此时,即使用输入的对应频率除以10,就可到了number[i]。我的实现中没有考虑全部的情况,只处理输入频率为10的整数倍。做这种题目的时候,要留心,处理输入不合法,还有总频率和不等于100的情况。核心步骤是:1、产生一个随机数 rad;2、另rad=rad/array_length;array_length为输入的字符串的个数3、看产number[rad]的值,如果>0,则输出第rad字符串,如果=0.则 rad=(rad+1)%array_length。访问下一个字符串,如果还是为0的话,则继续顺序访问。4、循环执行步骤3共n次,就得到符合的结果了程序如下:
#include<cstring>#include<iostream>#include <time.h>#include <fstream>using namespace std;int main(){int n;//表示一共输出多少个数,本例实现中只针对n为10的整数倍的数cin >> n;char buffer[256];ifstream readfile("random.txt");if(!readfile){cout << "Unable to open readfile";exit(1); // terminate with error}char array[10][10];//存放输入的字符串组合double number[10]={0,0,0,0,0,0,0,0,0,0};//存放对应字符串的频率char a_buf[30];//临时缓冲,存放输入字符串int b;	//临时缓冲,存放输入对应字符串的频率,int i=0; //用于统计一共多少个字符串int sum=0;//用于统计输入的频率,查看最后的频率和是否为1000while (! readfile.eof() ){readfile.getline (buffer,10);sscanf(buffer,"%s %d",&a_buf,&b);if(a_buf[0] =='@'|| b<=0){ //输入不合法//			cout <<" The input is error1 "<<endl;return 0;}number[i]=(b/10)*(n/10);//计算每个对应字符串最终输出中输出多少个sum+=b;//统计频率和//		cout << number[i]<<" This is number[i]"<<endl;int len=strlen(a_buf);//		cout << "len is "<<len<<endl;for(int j=0; j<len;j++)array[i][j]=a_buf[j];array[i][j]='\0';//字符串结尾处理i++;a_buf[0]='@';//缓冲区更新为无实际意义的字符b=-1;}readfile.close();int array_length=i;//记录一共有多少行输入if(sum!=100){//总频率和不为100,则错误,返回cout << sum<<endl;cout << "The input is error 2:"<<endl;return 0;}cout <<"The random result is: "<<endl;srand( (unsigned)time( NULL ) );//产生随机数for(i=0; i<n;i++){int rad = rand();rad=rad%array_length;//让随机数控制在0~array_length之内while(number[rad]==0){rad=((rad+1)%array_length);//如果对应的number次数为0,表示该字符串需要输出的次数已经全部输出,换到下一个字符串}int length = strlen(array[rad]);for(int j=0; j<length;j++)//字符串输出{cout << array[rad][j];}cout <<endl;number[rad]--;//输出字符串的number次数减1}return 1;}
测试数据:文件里面a 50bb 10ccc 20dddd 20终端输入10.第一次随机结果为:The random result is:addddcccccccccddddddddccccccbbPress any key to continue第二次随机结果为:10The random result is:aaacccddddbbddddcccaaPress any key to continue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: