|
一种快速可预制的随机数组产生方法 下载源代码 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 |
背景:
阅读新闻
一种快速可预制的随机数组产生方法
| [日期:2005-12-30] | 作者:重庆大学光电学院311实验室 袁刚 | [字体:大 中 小] |
阅读: 次
【 打印 】
【 打印 】
相关新闻
相关关键词:
全站导航
gmail.com