ASP.NET中随机数的产生

DELPHI超级Internet控件集--INDY DELPHI超级Internet控件集--INDY 你有没有用DELPHI开发Internet程序?是不是常常会烦恼FastNet组件为什么没有源代码?有很多问题,不看源代码,真不知道是什么问题。是不是也觉得FastNet组件支持的网络协议还不够多?现在不用烦恼了,有一套功能很丰富、使用很方便、开放源代码的免费INTERNET控件集可以解决你的烦恼。这套控件集就是INDY了。  什么是INDY?它 阅读详情

大家可能都用过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 生成数字和字母组合的随机数

代码如下:private static char[] constant = { ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘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’, ‘O’, ‘P’,

asp.net随机数

Random rnd = new Random(); int rndNum = rnd.Next(); //int 取值范围内的随机数 int rndNum = rnd.Next(10); //得0~9的随机数 int rndNum = rnd.Next(10,20); //得10~19的随机数 int

u014796999的博客 7960

Asp.NET 随机码生成基类(随机字母,随机数字,随机字母+数字)

对于需要用asp.net 字母,随机数字,随机字母+数字生成随机码的朋友用的到

ASP.NET随机数

    我们可以使用两种方式初始化一个随机数发生器:     第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:     Random ro = new Random();     第二种方法可以指定一个int型参数作为随机种子:     int iSeed=10;     Random ro = new Random(10);     之后,我们就可以使用这个R

lovemoo的专栏 733

ASP.NET中创建生成随机数

ASP.NET编(Net) 844

asp.net不重复随机数

protected void Page_Load(object sender, EventArgs e)    ...{                Set_Random();    }    /**////     /// 不重复随机数    ///     /// 最小值    /// 最大值    /// 多少个随机数    ///     public int[] GetRandom

郑成的博客 1093

Windows下安装TCP调试助手问题解答

TCP调试助手是一款非常受欢迎的辅助调试UDP/TCP的工具软件,界面友好,功能强大实用,支持TCP Server、TCP Client、UDP等通信模式,支持hex发送和定时发送,并且TCP调试助手还可以支持多种协议,TCP Client,TCP Server,UDP Client,UDP Server

qq_29768197的博客 1836

UDP编程中遇到的一些问题总结

今天UDP编程,遇到了不少问题,第一次用UDP,收获挺大的。 今天犯了一个很傻的错误,就是在接收数据的时候,client.receive的时候,竟然忘了把client与端口绑定在一起,导致没有接收到数据…… 还有就是接收到字节数组后,不能直接toString(),必须用Encording中的getString()方法,否则得到的字节数组会转换错误,发送的时候也要用Encording方法。 貌

ipzlkmy 893

【MFC】实现简单UDP通信

创建一个基于对话框的MFC项目(名称为UDP),高级功能选中Windows套接字这个时候在CUDP类的InitInstance()方法中就会出现这样的代码用来初始化套接字如果没有选中,手动添加也是可以的。修改控件IDC_EDIT1的一些属性。

m0_72895175的博客 2530

C 下socket编程 udp协议测试

C 下socket编程 udp协议测试

qq_43667028的博客 342

asp.net(c#)两种随机数的算法,可用抽考题

asp.net(c#)两种随机数的算法,可用抽考题

ASP.NET基础函数六十四:Rnd() 取得介于0 到1 之间的小数,如果每次都要取得不同的值,使用前需加上Randomize 叙述

或者,如果你使用的是ASP.NET Web Forms或MVC,并且需要在多个请求之间保持随机数的随机性,你可以考虑将。方法的参数定义了随机数的范围,第一个参数是范围的下限(包含),第二个参数是范围的上限(不包含)。对象作为类的成员变量或静态变量,以避免在短时间内生成相同的随机数序列。对象,它们可能会得到相同的种子值,从而生成相同的随机数序列。在ASP.NET中,如果你想要生成随机数,你可以使用。请注意,如果你在一个循环或频繁调用的方法中创建。在上面的代码中,我们首先创建了一个。

yixiaobing的博客 619

asp.net用for语句循环生成多个不同的随机数

 asp.net用for语句循环生成多个不同的随机数我们在使用Random生成随机数时经常会出现一种误区,下面我们就此介绍一下:一般的生成随机数方法:Random   ran=new   Random();     int  temp=ran.Next(100);生成100以内的一个随机数;这是没有什么问题的但是我们经常用到for循环生成多个随机数,这时候可能就会出现问题,如果你对

arqq1230的专栏 1066

Asp.NET 生成随机码基类(随机字母,随机数字,随机字母+数字 )

Asp.NET 生成随机码基类(随机字母,随机数字,随机字母+数字 ) using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebCon

hyhyct的专栏 893

ASP.NET随机数生成及应用

asp.net随机数生成及应用asp.net随机数生成及应用 -------------------------------------------------------------------------------- 转载    摘 要 伪随机数在计算机软件设计中有很广泛的用途。本文介绍了伪随机数生成的一般原理,以 及利用asp.ne...

weixin_33859665的博客 529

「基础」C#中的随机数

public partial class RandomNum : System.Web.UI.Page...{    protected void Page_Load(object sender, EventArgs e)    ...{        //方法一产生随机数。        Response.Write(getRandomOne()+"");        //方法二产生随机数

雨伞 CSDN专栏 1400
上一篇: ASP.NET编程的十大技巧
libing1984
博客等级 码龄22年 1粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值