首页 > 范文大全 > 正文

基于循环的随机数列产生并存放研究

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于循环的随机数列产生并存放研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:利用循环产生随机数列,并把这些随机数列依次存储在数据库中。研究表明:选用不同的数据库会显示不同的存放效果。

关键词:循环结构;随机数列;Access;Sql Server

中图分类号:TP391文献标识码:A文章编号:1672-7800(2012)012-0132-02

0引言

循环结构是程序设计的3种基本结构之一,它可以在某个条件下反复执行一段算法,从而减少重复书写的工作量。Access和SQL Server均为微软产品。Access为单机版数据库,多应用于小型系统上, 它结合了“Microsoft Jet Database Engine”和“图形用户界面”两项特点,是Microsoft Office的成员之一。SQL Server为网络数据库,安全性高,真正的客户机/服务器体系结构,图形化用户界面,使系统管理和数据库管理更加直观、简单,丰富的编程接口工具为用户进行程序设计提供了更大的选择余地,多为中型企业级的应用。在开发各种管理系统时,常需要本地数据库和网络数据库配合使用,这种情况下,SQL Server和Access往往是首选数据库。但是相同的循环程序,应用不同的后台数据库,却产生了不同的存储结果。

1随机数列的生成与存放

在很多时候,需要通过循环产生多个随机数列,并把它们依次存储在数据库中。例如在某网络测评系统中,既要保证有授权的人员进行投票,又要实现匿名投票,所以需要产生多个不同的随机数列作为登陆码,并存放在数据库中。产生随机数列的方法如下:

public string RandLetter(int n)

{

char[] arrChar = new char[]{

'a','b','c','d','e','f','g','h','i','j','k','l','m','n','p','q','r','s','t','u','v','w', 'x', 'y' ,'z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N', 'P','Q' ,'R', 'S','T' ,'U','V','W','X','Y','Z' };

StringBuilder num = new StringBuilder();

Random rand = new Random(DateTime.Now.Millisecond);

for (int i = 0; i < n; i++)

{

num.Append(arrChar[rand.Next(0, arrChar.Length)].ToString());

}

return num.ToString();

}

为了产生多个随机码,则通过循环多次调用上述产生随机数列的程序,如下所示:

for (int i = 0; i < g_voter.Rows.Count; i++)

{

Session["code"]=null;

int i_groupId = Convert.ToInt32(groupId);

String s_groupId = i_groupId.ToString();

if (i_groupId < 10)

{

s_groupId = "0" + groupId;

}

else

{

s_groupId = groupId;

}

Session["code"] = cc.RandLetter(6);

passCode = s_groupId + ((Label)(g_voter.Rows[i].FindControl("Label1"))).Text.ToString() + Session["code"];

if (Session["voteId"] != null)

{

voteId = Session["voteId"].ToString();

}

else

{

this.ClientScript.RegisterStartupScript(this.GetType(), "", cc.MessageBox("验证码生成失败!"));

return;

}

……

}

上述程序,如果选用Access作为存储随机数列的数据库,则产生如图1中“投票人验证码”字段中的效果,能够按照编码规则产生不同的随机数列,不会出现重复序列。而如采用sql server作为存储随机数列的数据库,则产生如图2所示的效果,会有多条重复记录出现。

2问题研究及解决方案

如上程序在不同配置的多台PC机上测试,均是前述效果。但在Sql Server作为存储数据库时,程序分步跟踪执行,则不会产生相同的序列,所以推断随机数的产生、存放与程序的执行速度、数据存取速度相关。

为了确保通过循环产生的随机序列不重复,并依次将这些随机数列存放在数据库中,在产生随机数的方法中增加一个参数:

public string RandLetter(int n,int t)

{

……

Random rand = new Random(DateTime.Now.Millisecond+t);

……

}

然后在循环中调用该方法时,因为循环变量i的取值不同,保证Random方法每次被调用参数值不同,也保证了随机数列的不同,如下程序所示:

for (int i = 0; i < g_voter.Rows.Count; i++)

{

……

Session["code"] = cc.RandLetter(6,i);

……

}

3结语

在系统开发过程中,若应用Access作为存储随机序列的数据库,系统运行速度很慢,但随机数列的产生不会出现重复现象;但是将数据库更换为Sql Server后,同样的程序,却会出现多个重复的验证码,如果跟踪测试,则又不会出现重复情况,经过不断的思考、测试,提出了如上的解决方案。系统在后面的软件测试、试运行阶段,均没有出现重复数据序列的现象。

参考文献:

[1]张海藩.软件工程导论[M].北京:清华大学出版社,2010.

Research of Random Number Column Generate

and Store Based on Cycle

Abstract:produce some random number sequences by the circulation and store the random number sequences in the database, but the selection of different database shows the different store.

Key Words: Loop Structure; Random Sequence; Access; Sql Server