java产生随机数组:一种快速可预制的随机数组产生思路方法



本文介绍了种简单、快捷、实用随机产生思路方法经调试通过附件为全部代码请审阅

  在工程软件Software设计和安全系统设计中建立模型、产生密码经常需要使用到随机然而计算机不会产生绝对随机随机数计算机只能产生“伪随机数”其实绝对随机随机数只是种理想随机数即使计算机怎样发展它也不会产生串绝对随机随机数计算机只能生成相对随机数即伪随机数
   伪随机数并不是假随机数而是指有规律事实上都是由计算机经过算法计算得到大家常用思路方法是根据个给定数作为种子如采用变化时间作为种子srand((unsigned)time(NULL))后执行rand从而获得个随机数很显然相同或相近种子得到随机数将会是完全样或互相接近
   因此要产生真正意义随机数那么种子首先必须是随机随机种子可以通过外接硬件随机发生器产生据说最新el处理器即采用了读取cpu上热噪声思路方法来获取随机数当无法利用硬件随机发生器时我们常采用办法是在两次srand((unsigned)time(NULL))的间加入定时间延时但当需要产生个很大随机这种延时是漫长而不可忍受而且事实上由于延时具有规律性产生随机数也不那么随机
   种容易想到产生随机思路方法是设计出复杂算法从而减小结果规律性这种思路方法需要很高窍门技巧也不太适合
   此外在很多情况下我们不仅要求产生随机同时还对产生有统计规律上要求如必须服从正态分布均匀分布等简单srand和rand无法满足需要
Matlab是种功能强大工程数学软件Software利用其随机产生模块我们能很容易得到服从各种分布形式其随机数产生原理即是基于复杂算法因此我们自然想到利用matlab产生随机数表来作为随机数池从中获得我们所需要随机
   本随机产生思路方法由 3部分组成:其是txt文件随机数池这里我利用matlab产生1000个服从正态分布随机数10个每两个数字的间间隔3个空格行首3个空格存为文本文档个数序号为0然后按先行后列序号依次排列到999;其 2和 3分别是从随机数池中捞取随机数.h文件和.cpp文件
   在捞取随机类中定义CStdioFilefile1打开作为随机数池txt文档首先以时间作为种子产生个0-999随机数读取随机数池中从以这个值为序号开始直到读够所需随机序号如果超出数池范围则跳到数池开始继续读取
   需要输入 m_Collect_Times,double *a_Random, m_Txt_Line, m_Txt_Row, m_Txt_Spacing分别代表取点个数、取得随机存储位置、随机数池行数、列数、数池中两数间空格个数并将\"C:\\\\Yg\\\\Debug\\\\ramdom1000txt\"改为你随机数池文件位置\" \"中空格数改为你所使用空格数

下面为本类中主要代码:

void CRandomArrayFromTxt::GetRandomArrayFromTxt( m_Collect_Times,
double *a_Random,
m_Txt_Line,
m_Txt_Row,
m_Txt_Spacing)
{

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;
ct=0; // 用于记录当前已经取得随机数个数
for(m=0;m<my;m)
{
file1.ReadString(strc);
}

// 取出有用直到取够为的
for( n=0;n<cl;n)
{
(n+mym_Txt_Line)
file1.SeekToBegin;

// 数表不够长重新定位到文件头
file1.ReadString(strc);

(n0) // 如果是取得
{
aw1,aw2;
aw1=strc.GetLength;
for(m=0;m<mx+1;m) // 过掉前面无用空格
{
aw1=strc.GetLength;
aw2=strc.Find(\" \"); // 找到作为间隔前 3个空格所在位置
strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这 3个空格右边所有
}

// 下面取出剩下串中每 3个空格前面就是所要查个数据
for(m=0;m<m_Txt_Row-mx&&ct<m_Collect_Times;m)
{
aw2=strc.Find(\" \");// 找到作为间隔后 3个空格所在位置
(mxm_Txt_Row-1||mm_Txt_Row-mx-1)
a_Random[ct]=atof(strc);

a_Random[ct]=atof(strc.Left(aw2)); // 保存数据到
aw1=strc.GetLength;
aw2=strc.Find(\" \"); // 找到作为间隔前 3个空格所在位置
strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这 3个空格右边所有
ct;
}
}

{
GetRandomArrayFromALine(strc,a_Random,
m_Collect_Times,
m_Txt_Row,
m_Txt_Spacing,
ct);
ctm_Txt_Row;
}
}
file1.Close;
}

///////////////////////
// 从行中取出数字
///////////////////////
void CRandomArrayFromTxt::GetRandomArrayFromALine(CString strc,
double *a_Random,
m_Collect_Times,
m_Txt_Row,
m_Txt_Spacing,
ct)
{
aw1,aw2;
aw1=strc.GetLength;
aw2=strc.Find(\" \");
strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这 3个空格右边所有
for( m=0;m<m_Txt_Row&&ct<m_Collect_Times;m)
{
aw2=strc.Find(\" \");
(mm_Txt_Row-1)
a_Random[ct]=atof(strc);

a_Random[ct]=atof(strc.Left(aw2));// 保存数据到
aw1=strc.GetLength;
aw2=strc.Find(\" \");// 找到作为间隔前 3个空格所在位置
strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这 3个空格右边所有
ct;
}


}




Tags:  php数组随机 随机数组java 随机数组 java产生随机数组

延伸阅读

最新评论

发表评论