家可能都用过Chinaren的校友录,不久前它的留言簿上加了一个防止灌水的方法,就是系统每次产生一个由随机的数字和字母组成的图片,每次留言必须正确地输入这些随机产生的字符,否则不能添加留言。这是一个很好的防止恶意攻击的方法,其核心的技术就是如何产生随机数。Chinaren网站是使用PHP实现的,而我们可以充分利用ASP.net的强大功能很轻易地实现。
在.net Framework中提供了一个专门用来产生随机数的类System.Random,使用这个类时必须导入System命名空间。当然,命名空间System在每个ASP.net页面中都是自动导入的,所以我们可以直接使用这个类。
对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。一般地,我们使用同系统时间有关的参数作为随机种子,这也是.net Framework中的随机数发生器默认采用的方法。
我们可以使用两种方式初始化一个随机数发生器:
第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:
Random ro = new Random();
第二种方法可以指定一个int型参数作为随机种子:
int iSeed=10;
Random ro = new Random(10);
之后,我们就可以使用这个Random类的对象来产生随机数,这时候要用到Random.Next()方法。这个方法使用相当灵活,你甚至可以指定产生的随机数的上下限。
不指定上下限的使用如下:
int iResult;
iResult=ro.Next();
下面的代码指定返回小于100的随机数:
int iResult;
int iUp=100;
iResult=ro.Next(iUp);
而下面这段代码则指定返回值必须在50-100的范围之内:
int iResult;
int iUp=100;
int iDown=50;
iResult=ro.Next(iDown,iUp);
除了Random.Next()方法之外,Random类还提供了Random.NextDouble()方法产生一个范围在0.0-1.0之间的随机的双精度浮点数:
double dResult;
dResult=ro.NextDouble();
另外一个与Random.NextDouble()方法相似的方法是Random.Sample(),它跟Random.NextDouble()方法唯一的区别在于访问级别,我们可以看看它们的原始声明:
protected virtual double Sample();
public virtual double NextDouble();
Random.Sample()方法是保护方法,只允许子类的对象访问,而Random.Sample()方法则可以看作是Random.Sample()的公开版本。一般地,用户在Random的子类中重写Sample()方法来得到更一般的分布。 这个例子中,我们使用Random.Next()方法来产生随机数。
下面这个函数是这个例子的核心,我们利用他来产生一个随机的int数组:
private int []GetRandomArray(int Length,int Up,int Down){ int iFirst=0; int []rtArray=new Int32[Length]; Random ro=new Random(Length*unchecked((int)DateTime.Now.Ticks)); iFirst=ro.Next(Up,Down); rtArray[0]=iFirst; for(int i=1;i
读者或许都注意到了,我们采用了一种相当麻烦的方式来产生这个随机数组,为什么不简单地使用如下代码呢?请先看下面代码,这里我们使用了系统时间作为随机种子,连续获取两个随机数,并且将其输出:
< %@ Page Language="C#" Debug="true" Trace="false" TraceMode="SortByCategory"% >< % @Import namespace="System" % >
< script language=C# runat=server >
public void Page_Load(object sender,EventArgs e){ int re=0; int re1=0; GetRandomDefault(ref re); GetRandomDefault(ref re1); RandomNum.Text=re.ToString(); RandomNum.Text+=" "+re1.ToString();}private void GetRandomDefault(ref int re){ Random ro=new Random(unchecked((int)DateTime.Now.Ticks)); re=ro.Next(10,20);}private void GetRandomByInt(ref byte []re){ Random ro=new Random(); ro.NextBytes(re);}
< /script >
< html >
< head >
< title >随机数测试< /title >
< meta http-equiv="Content-Type" content="text/html; charset=gb2312" >
< /head >
< body bgcolor="#FFFFFF" text="#000000" >
< form runat=server >
< asp:Label id="RandomNum" runat=server / >
< /form >
< /body >
< /html >
下面是笔者机器上产生的结果的截图:
是的,如你所见,产生了一样的两个随机数,无论重复多少次,都是一样的。原因在哪里呢?
不要以为使用系统时间作为随机种子就万无一失了——如果应用程序在一个较快的计算机上运行,则该计算机的系统时钟可能没有时间在此构造函数的调用之间进行更改,Random 的不同实例的种子值可能相同。这种情况下,我们就需要另外的算法来保证产生的数字的随机性。所以为了保证产生的随机数足够“随机”,我们不得不使用复杂一点的方法来获得随机种子。
在上面的这段程序中,我们首先使用系统时间作为随机种子,然后将上一次产生的随机数跟循环变量和一个与系统时间有关的整型参数相乘,以之作为随机种子,从而得到了每次都不同的随机种子,保证了产生足够“随机”的随机数。
得到整型的随机数组以后,我们将它变成字符串,然后使用System.Drawing中与GDI+相关的类生成一个图片并且在网页上显示出来。
生成图片的ASP.net页面全部代码如下:
< %@ Page Language="C#" Debug="true" Trace="false" TraceMode="SortByCategory"% >< % @Import namespace="System.Drawing" % >< % @Import namespace="System.Drawing.Imaging" % >< % @Import namespace="System.Drawing.Text" % >< % @Import namespace="System.IO" % >< script language=C# runat=server >
public void Page_Load(object sender,EventArgs e){ string strNum=GetRandomString();
string strFontName;
int iFontSize;
int iWidth;
int iHeight;
strFontName="宋体";
iFontSize=12;
iWidth=10*strNum.Length;
iHeight=25;
Color bgColor=Color.Yellow;
Color foreColor=Color.Red;
Font foreFont=new Font(strFontName,iFontSize,FontStyle.Bold);
Bitmap Pic=new Bitmap(iWidth,iHeight,PixelFormat.Format32bppArgb);
Graphics g=Graphics.FromImage(Pic);
Rectangle r=new Rectangle(0,0,iWidth,iHeight);
g.FillRectangle(new SolidBrush(bgColor),r);
g.DrawString(strNum,foreFont,new SolidBrush(foreColor),2,2);
MemoryStream mStream=new MemoryStream();
Pic.Save(mStream,ImageFormat.Gif);
g.Dispose();
Pic.Dispose();
Response.ClearContent();
Response.ContentType="image/GIF";
Response.BinaryWrite(mStream.ToArray());
Response.End();
}
private int []GetRandomArray(int Length,int Up,int Down)
{
int iFirst=0;
int []rtArray=new Int32[Length];
Random ro=new Random(Length*unchecked((int)DateTime.Now.Ticks));
iFirst=ro.Next(Up,Down);
rtArray[0]=iFirst;
for(int i=1;i< Length;i++)
{
Random ri=new Random(i*iFirst*unchecked((int)DateTime.Now.Ticks));
rtArray[i]=ri.Next(Up,Down);
iFirst=rtArray[i];
}
return rtArray;
}
其中生成图片的部分相对复杂,但由于不是本文的主题所在,所以本文不对之做详细说明,有兴趣的读者可以参考杜亮编写的《亲密接触ASP.net》一书中的相关内容。
最后我们可以编写一个普通的HTML页面来查看效果,只要把图片的src属性指向这个页面就行了(这里我们假设上面那个ASP.net文件的名字是“RandomPic.aspx”):
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
< HTML >
< HEAD >
< TITLE > New Document < /TITLE >
< META NAME="Generator" CONTENT="EditPlus" >
< META NAME="Author" CONTENT="" >
< META NAME="Keywords" CONTENT="" >
< META NAME="Description" CONTENT="" >
< /HEAD >
< BODY >
< img src="RandomPic.aspx" >
< /BODY >
< /HTML >
在笔者的机器上成功地看到了如下结果:
要实现像Chinaren网站那样的防恶意攻击的效果,只需要在留言簿的页面里产生随机数并且编写相应的JavaScript验证代码(事实上这个工作可以交给ASP.net的验证控件很容易地完成),然后传递到生成图片的页面里生成图片提示用户就可以了。
除此以外,随机数还有其它很多用途,特别是开发游戏的时候更是必不可少。到此,读者应该完全掌握在ASP.net中随机数的产生方法,如此,本文的目的也就达到了。
最后,有兴趣的读者可以试着解决这个问题:
在桥牌游戏中,发牌可以视作一个随机过程,但是后续过程受到前面的影响,即已经发出去的牌不可能再次发出。试编写一个程序模拟发牌过程。
作者:未知 请速与本人联系
分享到:
相关推荐
在ASP.NET中生成随机数是一项常见的任务,尤其是在创建动态网页、进行数据填充或者实现安全相关的功能时。ASP.NET提供了一些内置的方法和类来帮助开发者生成随机数。下面将详细介绍如何在ASP.NET中生成随机数以及...
本文将详细介绍如何在ASP.NET环境中生成随机数及其基本应用。 #### 一、System.Random 类介绍 在.NET Framework中,`System.Random`类提供了生成随机数的功能。该类位于`System`命名空间下,可以通过创建该类的...
在ASP.NET应用开发中,生成随机数是一项基本但又十分重要的功能。无论是简单的随机数生成还是需要高度安全性的随机数生成,都能够在.NET Framework提供的类库中找到合适的解决方案。通过合理利用这些工具和技术,...
本实例将深入探讨Asp.net中的同步与异步编程,并结合客户对象的应用,来实现一个动态生成随机数并实时显示的功能。 首先,同步和异步编程是两种处理任务的方式。在同步编程中,代码按照顺序执行,一个任务必须等待...
·剖析ASP.NET2.0站点导航功能之建立导航 ·用JavaScript解决ASP.NET服务器控件造成的刷新问题 ·ASP.NET中如何防范SQL注入式攻击 ...·ASP.net中随机数应用实例 ·用asp.net实现的把本文推荐给好友功能
在ASP.NET中,可以使用`Random`类来生成随机数,以及`System.Drawing`命名空间中的类来创建图像、字体和颜色。 例如,以下代码展示了如何创建一个简单的验证码生成器: ```csharp using System.Drawing; using ...
开发者可能使用了跨平台开发工具,如Xamarin,使ASP.NET应用能运行在Android平台上。这涉及到Android SDK、Xamarin.Android API以及适应移动设备的界面设计原则。 总之,这个ASP.NET猜数游戏项目涵盖了Web开发的多...
ASP.NET 是微软开发的...通过以上步骤,我们可以创建一个ASP.NET中文验证码实例,为Web应用提供更高级别的安全保护。在实际开发中,还可以结合其他技术如AJAX实现无刷新验证,以及使用HTTPS加密传输以增强数据安全性。
在 ASP.NET 应用程序中,你可以通过调用这个方法来获取所需的随机字符串,例如: ```csharp string randomStr = pxkt_GetCharFont(10); // 生成一个10位的随机字符串 ``` 此外,给定的标签提到了“AS”、“asp”、...
说明:由于本文件超过了二十M,所以分两次上传,第二分卷卷不用资源分就可下载!! ·剖析ASP.NET2.0站点导航功能之建立导航 ...·ASP.net中随机数应用实例 ·用asp.net实现的把本文推荐给好友功能
ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地创建动态、交互式的网站。在这个特定的场景中,我们关注的是如何在ASP.NET中实现验证码功能,这是一种用于验证...
继续上一卷的上传!!!!!好书不容错过!! ·剖析ASP.NET2.0站点导航功能之建立导航 ·用JavaScript解决ASP.NET服务器控件造成的刷新问题 ...·ASP.net中随机数应用实例 ·用asp.net实现的把本文推荐给好友功能
在ASP.NET中,图片上传是一项常见的功能,广泛应用于各种网站,如社交网络、电商网站和个人博客等。这个实例提供了一个基础的图片上传解决方案,帮助开发者理解如何在ASP.NET环境中处理用户上传的图像文件。以下是对...
总的来说,这个C#编写的ASP.NET论坛是一个包含完整功能的Web应用实例,它展示了如何利用.NET技术栈来创建一个互动的在线社区,同时也为学习和实践提供了丰富的素材。通过深入研究其源码,开发者可以提升自己的C#编程...
本篇文章将详细解析一段在ASP.NET中生成随机数的代码,并探讨其工作原理及应用场景。 #### 代码分析 ##### 方法定义 ```csharp /// ///返回随机数 /// ///<param name="VcodeNum"></param> ///<returns></returns>...
总的来说,这个ASP.NET验证码程序通过结合C#的图像处理能力和随机数生成,创建了一个安全且实用的验证工具,同时提供了具体的调用示例,方便开发者集成到自己的Web应用中。理解并掌握这种验证码的实现原理和方法,...
ASP.NET是一种基于微软.NET Framework的Web应用程序开发平台,它提供了丰富的功能和强大的工具来构建动态网站、Web应用程序和Web服务。在本主题中,我们将深入探讨如何使用GDI+(Graphics Device Interface Plus)在...
ASP.NET MVC 验证码类使用 本文档介绍了 ASP.NET MVC 中验证码类的使用,包括验证码类的定义、验证码的生成和验证等内容。 知识点一:验证码类的定义 在 ASP.NET MVC 中,验证码类是用于生成和验证验证码的类。在...
ASP.NET是一种由微软开发的开源框架,用于构建Web应用程序和服务。在这个特定的实例中,"ASP.NET实例开发源码——在线密码生成器(CipherMaker)v2.0.zip" 提供了一个名为CipherMaker的在线工具,它能够帮助用户生成...
这个"基于ASP.NET的年会抽奖程序源码.zip"压缩包文件包含了一个用于年会抽奖活动的完整源代码,这为我们提供了一个深入了解ASP.NET编程和Web应用程序开发的实例。 在ASP.NET中,我们可以使用C#或VB.NET作为后端编程...