ASP.NET网页编程之随机数是哄人的,.Net、Java、C为我作证仓酷云
效率会有不少的变化。而实际上net网页编程是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。几近一切编程言语中都供应了"天生一个随机数"的办法,也就是挪用这个办法会天生一个数,我们事前也不晓得它天生甚么数。好比在.Net中编写上面的代码:Randomrand=newRandom();
Console.WriteLine(rand.Next());
运转后了局以下:
Next()办法用来前往一个随机数。一样的代码你实行和我的了局极可能纷歧样,并且我屡次运转的了局也极可能纷歧样,这就是随机数。
1、圈套
看似很复杂的工具,利用的时分有圈套。我编写上面的代码想天生100个随机数:
for(inti=0;i<100;i++)
{
Randomrand=newRandom();
Console.WriteLine(rand.Next());
}
太奇异了,居然天生的"随机数"有很多多少一连一样的,这算甚么"随机数"呀。有人指导"把newRandom()"放到for轮回表面就能够了:
Randomrand=newRandom();
for(inti=0;i<100;i++)
{
Console.WriteLine(rand.Next());
}
运转了局:
的确能够了!
2、这是为何呢?
这要从盘算机中"随机数"发生的道理提及了。我们晓得,盘算机是很严厉的,在断定的输出前提下,发生的了局是独一断定的,不会每次实行的了局纷歧样。那末怎样用软件完成发生看似不断定的随机数呢?
天生随机数的算法有良多种,最复杂也是最经常使用的就是"线性同余法":第n+1个数=(第n个数*29+37)%1000,个中%是"求余数"运算符。良多像我一样的人见了公式都头疼,我用代码注释一下吧,MyRand是一个自界说的天生随机数的类:
classMyRand
{
privateintseed;
publicMyRand(intseed)
{
this.seed=seed;
}
publicintNext()
{
intnext=(seed*29+37)%1000;
seed=next;
returnnext;
}
}
以下挪用:
MyRandrand=newMyRand(51);
for(inti=0;i<10;i++)
{
Console.WriteLine(rand.Next());
}
实行了局以下:
天生的数据是否是看起来"随机"了。复杂注释一下这个代码:我们创立MyRand的一个对象,然后机关函数传送一个数51,这个数被赋值给seed,每次挪用Next办法的时分依据(seed*29+37)%1000盘算失掉一个随机数,把这个随机数赋值给seed,然后把天生的随机数前往。如许下次再挪用Next()的时分seed就不再是51,而是前次天生的随机数了,如许就看起来仿佛每次天生的内容都很"随机"了。注重"%1000"取余预算的目标是包管天生的随机数不凌驾1000。
固然不管是你运转仍是我每次运转,输入了局都是一样的随机数,由于依据给定的初始数据51,我们就能够顺次揣度上去上面天生的一切"随机数"是甚么都能够算出来了。这个初始的数据51就被称为"随机数种子",这一系列的516、1、66、951、616……数字被称为"随机数序列"。我们把51改成52,就会有如许的了局:
3、楼主坏人,跪求种子
那末怎样可使得每次运转程序的时分都天生分歧的"随机数序列"呢?由于我们每次实行程序时分的工夫极可能纷歧样,因而我们能够用以后工夫做"随机数种子"
MyRandrand=newMyRand(Environment.TickCount);
for(inti=0;i<10;i++)
{
Console.WriteLine(rand.Next());
}
Environment.TickCount为"体系启动后经由的微秒数"。如许每次程序运转的时分Environment.TickCount都不年夜大概一样(靠手动谁能一微秒内启动两次程序呢),以是每次天生的随机数就纷歧样了。
固然假如我们把newMyRand(Environment.TickCount)放到for轮回中:
for(inti=0;i<100;i++)
{
MyRandrand=newMyRand(Environment.TickCount);
Console.WriteLine(rand.Next());
}
运转了局又酿成"良多是一连"的了,道理很复杂:因为for轮回体实行很快,以是每次轮回的时分Environment.TickCount极可能还和前次一样(两行复杂的代码运转用不了一毫秒那末长事务),因为此次的"随机数种子"和前次的"随机数种子"一样,如许Next()天生的第一个"随机数"就一样了。从"-320"酿成"-856"是由于运转到"-856"的时分工夫过了一毫秒。
4、各言语的完成
我们看到.Net的Random类有一个int范例参数的机关函数:
publicRandom(intSeed)
就是和我们写的MyRand一样承受一个"随机数种子"。而我们之前挪用的无参机关函数就是给Random(intSeed)传送Environment.TickCount类举行机关的,代码以下:
publicRandom():this(Environment.TickCount)
{
}
这下我们终究分明最入手下手的困惑了。
一样事理,在C/C++中天生10个随机数不该该以下挪用:
<p><p> Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。 网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项! 通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。 ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。 ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。 Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
页:
[1]