ASP.NET
中随机数生成及应用
伪随机数在计算机软件设计中有很广泛的用途。本文介绍了伪随机数生成的一般原理
摘
要
伪
随机数
在计算机软件设计中有很广泛的用途。本文介绍了伪
随机
数生成的一般原理,以及利用
ASP.NET Framework
中提供的
Random
类及其方法来生成各种不同范围的满足各种要求的随机数。最后结合
Web
控件表单阐述了
ASP.NET
中的随机数在软件设计中的应用。
关键词 ASP.NET ;伪随机数生成; Web; Random 类
随机数在软件设计,尤其是在实践环境模拟和测试等领域中得到很广泛的应用。为追求真正的随机序列,人们曾采用很多种原始的物理方法用于生成一定范围内满足精度(位数)的均匀分布序列,其缺点在于:速度慢、效率低、需占用大量存储空间且不可重现等。为满足计算机模拟研究的需求,人们转而研究用算法生成模拟各种概率分布的伪随机序列。伪随机数是指用数学递推公式所产生的随机数。从实用的角度看,获取这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。不同的开发环境提供的生成随机数的函数和方法不一样。典型情况下,它会输出一个均匀分布在 0 和 1 区间内的伪随机变量的值。
随机数发生器
在计算机中产生随机数的方法,经常采用下面的公式:
用这个公式产生 0~65536 的随机数 a1 , a2 , … 序列的程序,称为 232 步长的倍增谐和随机数发生器。其中 b 、 c 、 d 为正 整数 , d 称为由公式所产生的随机序列的种子。
由该公式可以看出,一旦参数 b 、 c 、 d 确定之后,所产生的随机序列也是确定的。这种只在一定程度上满足随机性的序列称为伪随机数。
下面是随机数发生器的一个例子。其中,函数 random_seed 提供给用户选择随机数的种子,当形式参数 d=0 时,取系统当前时间作为随机数种子;当 d≠0 时,就选用 d 作为种子;函数 random 在给定种子的基础上,计算新的种子,并产生一个范围为 low~high 的新的随机数。
关键词 ASP.NET ;伪随机数生成; Web; Random 类
随机数在软件设计,尤其是在实践环境模拟和测试等领域中得到很广泛的应用。为追求真正的随机序列,人们曾采用很多种原始的物理方法用于生成一定范围内满足精度(位数)的均匀分布序列,其缺点在于:速度慢、效率低、需占用大量存储空间且不可重现等。为满足计算机模拟研究的需求,人们转而研究用算法生成模拟各种概率分布的伪随机序列。伪随机数是指用数学递推公式所产生的随机数。从实用的角度看,获取这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。不同的开发环境提供的生成随机数的函数和方法不一样。典型情况下,它会输出一个均匀分布在 0 和 1 区间内的伪随机变量的值。
随机数发生器
在计算机中产生随机数的方法,经常采用下面的公式:
用这个公式产生 0~65536 的随机数 a1 , a2 , … 序列的程序,称为 232 步长的倍增谐和随机数发生器。其中 b 、 c 、 d 为正 整数 , d 称为由公式所产生的随机序列的种子。
由该公式可以看出,一旦参数 b 、 c 、 d 确定之后,所产生的随机序列也是确定的。这种只在一定程度上满足随机性的序列称为伪随机数。
下面是随机数发生器的一个例子。其中,函数 random_seed 提供给用户选择随机数的种子,当形式参数 d=0 时,取系统当前时间作为随机数种子;当 d≠0 时,就选用 d 作为种子;函数 random 在给定种子的基础上,计算新的种子,并产生一个范围为 low~high 的新的随机数。
#define MULTIPLIER 0x015A4E35L #define INCREMENT 1 void random_seed ( unsigned long d){ if ( d == 0 )seed = time(0); else seed = d;} unsigned int random(unsigned long low,unsigned long high) { seed = MULTIPLIER * seed + INCREMENT; return ((seed >>16 )% ( high-low ) + low ); } } |
ASP.NET 中伪随机数生成机制
计算机不可能产生完全随机的数字。所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。
1 、 VB.NET 内建函数
ASP.NET 程序可以采用多种编程语言,其默认的程序语言是 VB.NET ,虽然 VB.NET 和 VB 有些相似,但它们的应用环境不一样,编写代码的方法也有所不同。 在VB.NET 中,如果要使用数学函数,必须通过 .NET Framework 提供的 Math 类,它位于 System 命名空间下,用户可以在代码顶部添加 Imports System. Math 以便使用这些数学函数。
其中用于产生随机数的函数原型为: Rnd ( x ),该函数用以产生一个介于 0~1 之间的单精度随机数。 x 是产生随机数的种子。如果要从 (min, max) 这个范围内随机抽取一个数,此时需要用到公式:随机数 = (max - min) * Rnd(x) + min 。
伪随机数的选择是从随机种子开始的,为了保证每次得到的伪随机数都足够地 “ 随机 ” ,随机种子的选择就显得非常重要。如果选择的随机种子一样则生成的随机序列也相同。一般地,使用同系统时间有关的参数作为随机种子,这也是 .net Framework 中的随机数发生器默认采用的方法。
2 、随机数类 System.Random
随机数类 System.Random 类提供以下方法用于产生各种满足不同要求的随机数,如表 1 所示:
表 1 System.Random 类提供的各种方法
编号
|
方法名称
|
功能描述
|
1
|
Next
()
|
返回一个0~2147483647之间的整数
|
2
|
Next
(i)
|
返回一个0~i之间的整数
|
3
|
Next
(i,j)
|
返回一个i~j之间的整数
|
4
|
Nextdouble
()
|
返回一个0~1之间的随机小数
|
5
|
Nextdouble
( byte())
|
用0~255之间的随机整数作为字节数组各元素的值。
|
使用随机数类 System.Random 必须先声明。如果要使用 Nextbytes ( byte ())方法,在使用前也必须声明字节数组。
3 、测试程序编写
在运行 ASP.NET 程序前必须建立其开发运行环境,包括配置 Microsoft IIS 和安装 .NET Framework SDK 以及机 MSE 编辑器。 MSE 编辑器是 Microsoft Office 的一个附加软件,作为 ASP.NET 的编辑工具非常方便。测试程序代码如下:
<script language="vb" runat="server"> sub page_load(send as object,e as eventargs) dim r1 as random =new random() response.write("The result of r1.next()is:"+r1.next().tostring()) response.write("Theresultofr1.next(100)is:" +r1.next(100).tostring()) response.write("The result of r1.next(100,150) is:"+r1.next(100,150).tostring()) response.write("The result of r1.nextdouble() is:"+r1.nextdouble().tostring()) r1.nextbytes(r) // dim r(300) as byte response.write("the r(100) is:") response.write(r(199)) end sub </script> |
其测试结果如图 1 所示:
实例开发
应用程序需求分析:创建一个用于模拟掷骰子游戏的应用程序。此游戏中,游戏者将随机滚动一个骰子。每一个骰子有六个面,分别代表 1 , 2 , 3 , 4 , 5 , 6 这六个点。当骰子停下以后,观察骰子上表面的点数。如果掷得的点数为 6 ,则提示赢的信息,否则将继续投掷。
1 、关键技术
1.1 Web 控件表单
Web 控件表单具有高级语言的面向对象的特性,它是 ASP.NET 中 System.Web.UI.WebControls 命名空间的对象。其处理过程与 HTML 控件表单相似,有如下几个特点:表单在服务器端运行;输入域都是控件,具有强大且丰富的属性和方法,输入域的信息可以保留;具备对输入域的验证能力;包含有数据显示控件等。
一个典型的 Web 控件表单代码如下:
< asp: button id=”sub3” text=”confirm” runat=”server”/ >
其中 ASP : XXX 指明是哪一类 Web 控件; ID 属性指明控件的标识名称; Runat 属性的值为 server ,指明这是在服务器端运行的控件。
本例中将用到的 Web 控件主要为按钮控件。其中 Image 控件用于显示图像文件,有以下几个属性: Imageurl ,指明图像文件的 URL ; Width ,图像文件显示的宽度; Height ,图像文件显示的高度等。
1.2 伪随机数生成
根据需求分析描述,为模拟随机投掷骰子所得到的点数,需要随机产生范围在 1~6 之间的整数,此时可利用到 System.Random 类的 Next ( i , j )方法,这里 i=1 , j=7 。(笔者编写了一个测试程序发现如果 j=6 ,所生成的随机数在 1~5 之间)
2 、程序实现
该程序的主要代码实现如下:
应用程序需求分析:创建一个用于模拟掷骰子游戏的应用程序。此游戏中,游戏者将随机滚动一个骰子。每一个骰子有六个面,分别代表 1 , 2 , 3 , 4 , 5 , 6 这六个点。当骰子停下以后,观察骰子上表面的点数。如果掷得的点数为 6 ,则提示赢的信息,否则将继续投掷。
1 、关键技术
1.1 Web 控件表单
Web 控件表单具有高级语言的面向对象的特性,它是 ASP.NET 中 System.Web.UI.WebControls 命名空间的对象。其处理过程与 HTML 控件表单相似,有如下几个特点:表单在服务器端运行;输入域都是控件,具有强大且丰富的属性和方法,输入域的信息可以保留;具备对输入域的验证能力;包含有数据显示控件等。
一个典型的 Web 控件表单代码如下:
< asp: button id=”sub3” text=”confirm” runat=”server”/ >
其中 ASP : XXX 指明是哪一类 Web 控件; ID 属性指明控件的标识名称; Runat 属性的值为 server ,指明这是在服务器端运行的控件。
本例中将用到的 Web 控件主要为按钮控件。其中 Image 控件用于显示图像文件,有以下几个属性: Imageurl ,指明图像文件的 URL ; Width ,图像文件显示的宽度; Height ,图像文件显示的高度等。
1.2 伪随机数生成
根据需求分析描述,为模拟随机投掷骰子所得到的点数,需要随机产生范围在 1~6 之间的整数,此时可利用到 System.Random 类的 Next ( i , j )方法,这里 i=1 , j=7 。(笔者编写了一个测试程序发现如果 j=6 ,所生成的随机数在 1~5 之间)
2 、程序实现
该程序的主要代码实现如下:
<script language="vb" runat="server"> sub disp(obj as object,e as eventargs) dim r1 as random =new random() //定义一个随机数类 dim file_prefix as string = "Images/die" dim file_suffix as string = ".png" value = r1.next(1,7) //dim value as Integer s1 = file_prefix + value.tostring() + file_suffix pic1.imageurl = s1 //更新Image控件的imageurl属性 if value = 6 then disp.text = "You win" //显示提示信息 else disp.text = "Try again" end if end sub </script> <form id="form1" runat="server"><br> <asp:button id="disp" runat="server" οnclick="disp" text="start"/> <asp:image id="pic1" runat="server" width="50" height="50"/></form> |
程序的运行结果如图 2 所示:
图 2 程序运行结果
结束语
Web 应用程序中有很多地方都要用到伪随机数,如何选择生成随机序列的种子参数,以及选用何种随机算法以期生成性能更佳的伪随机序列是计算机软件开发人员追求的目标之一。利用 ASP.NET 框架提供了伪随机数生成类以及脚本语言 VB.NET 提供的函数方法可以生成各种满足不同要求的随机序列。如在 Web 系统中用于身份认证的随机校验码就用到了随机数生成的技术,这点在网站上有很多文章介绍,在此不再赘述。