Posted on 2007-07-08 01:29
停留的风 阅读(653)
评论(0) 编辑 收藏 所属分类:
.NET技巧特辑
随机数在软件设计,尤其是在实践环境模拟和测试等领域中得到很广泛的应用。为追求真正的随机序列,人们曾采用很多种原始的物理方法用于生成一定范围内满足精度(位数)的均匀分布序列,其缺点在于:速度慢、效率低、需占用大量存储空间且不可重现等。为满足计算机模拟研究的需求,人们转而研究用算法生成模拟各种概率分布的伪随机序列。伪随机数是指用数学递推公式所产生的随机数。从实用的角度看,获取这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。不同的开发环境提供的生成随机数的函数和方法不一样。典型情况下,它会输出一个均匀分布在0和1区间内的伪随机变量的值。
随机数发生器 在计算机中产生随机数的方法,经常采用下面的公式:
用这个公式产生0~65536的随机数a
1,a
2,…序列的程序,称为2
32步长的倍增谐和随机数发生器。其中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 伪随机数测试运行结果