| 一种快速可预制的随机数组产生方法 下载源代码 void CRandomArrayFromTxt::GetRandomArrayFromTxt(int m_Collect_Times,double *a_Random,int m_Txt_Line, int m_Txt_Row,int m_Txt_Spacing){ int m,mx,my,cl; srand((unsigned)time(NULL)); // 生成时间种子 m=rand()%m_Txt_Line; // 返回一个0-m_Txt_Line-1的随机数,即查表的起始位置 mx=m%m_Txt_Row; // 查表起始位置的列号,文件头为0行0列 my=m/m_Txt_Row; // 查表起始位置的行号 cl=(m_Collect_Times+mx-1)/m_Txt_Row+1; // 需要从数表中读取的行数 // 打开txt文本的数表。 CStdioFile file1( "C:\\Yg\\Debug\\ramdom1000.txt",CFile::modeNoTruncate | CFile::modeRead | CFile::typeText); CString strc; int ct=0; // 用于记录当前已经取得的随机数个数 for(m=0;m<my;m++) { file1.ReadString(strc); } // 取出有用的行,直到取够为之 for(int n=0;n<cl;n++) { if(n+my==m_Txt_Line)file1.SeekToBegin();// 数表不够长,重新定位到文件头file1.ReadString(strc); if(n==0) // 如果是取得的第一行{ int aw1,aw2; aw1=strc.GetLength(); for(m=0;m<mx+1;m++) // 过掉前面无用的空格{ aw1=strc.GetLength(); aw2=strc.Find(" "); // 找到作为间隔的前三个空格所在位置 strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串} // 下面取出剩下的字符串中每三个空格前面的字符串,就是所要查一个数据for(m=0;m<m_Txt_Row-mx&&ct<m_Collect_Times;m++) { aw2=strc.Find(" ");// 找到作为间隔的后三个空格所在位置 if(mx==m_Txt_Row-1||m==m_Txt_Row-mx-1)a_Random[ct]=atof(strc); else a_Random[ct]=atof(strc.Left(aw2)); // 保存数据到数组 aw1=strc.GetLength(); aw2=strc.Find(" "); // 找到作为间隔的前三个空格所在位置 strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串 ct++;} } else {GetRandomArrayFromALine(strc,a_Random,m_Collect_Times,m_Txt_Row,m_Txt_Spacing,ct); ct+=m_Txt_Row;} } file1.Close();}///////////////////////// 从一行中取出数字///////////////////////void CRandomArrayFromTxt::GetRandomArrayFromALine(CString strc, double *a_Random, int m_Collect_Times, int m_Txt_Row, int m_Txt_Spacing, int ct){ int aw1,aw2; aw1=strc.GetLength(); aw2=strc.Find(" "); strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串 for(int m=0;m<m_Txt_Row&&ct<m_Collect_Times;m++) { aw2=strc.Find(" "); if(m==m_Txt_Row-1) a_Random[ct]=atof(strc); else a_Random[ct]=atof(strc.Left(aw2));// 保存数据到数组 aw1=strc.GetLength(); aw2=strc.Find(" ");// 找到作为间隔的前三个空格所在位置 strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串ct++; }} 本工程在VC++5.0、WindowsXP环境中调试通过。本方法所产生的随机数组实质上是数池中相连的一组数,对于某一数组长度只能产生m_Txt_Line×m_Txt_Row个不同的随机数组。因此越大的数池显然效果越好。此外,我们可以采用另外一种更好的办法捞取随机数组。即首先用时间作为种子产生随机数,从数池中捞取相应序号的数值,然后又用该数值作为种子生成随机数,再从数池中捞取相应序号的数值。 如此循环下去,直至取够需要的随机数组。该方法的程序也很容易写出,各位可以一试。 通信地址:(400044)重庆大学光电工程学院311实验室 袁刚 电子邮件:siryuangang@hotmail.com |