random函数详解 -电脑资料

dom|函数|详解

关于FLASH的效果,我想大家都想做出那种“不但让人一看忘不了,而且看了还想看”的效果吧?“一看忘不了”固然是高手作品,“看了还想看”也需要深厚功底和作品丰富的内涵,

random函数详解

。作为我们菜鸟,自然一时半全达不到那种高度。但是我们至少可以做到让人“每次看都有新鲜感”,关键是什么? ActionScrpt!

当然,如题,我是想讲random函数.AS其它方面的就留给高手了.这篇是献给菜鸟们看的.虽说是给菜鸟看的,但是我也假定菜鸟们还是会一点点AS,至少对于我给的代码能够运用到作品中去.

这几天,帝国论坛的AS区和新手区可能因为圣诞了,都在问"如何做雪花",我也给了个例子,高手也给了几个源文件,其中的一个关键语句就是random()函数.雪共本身倒是好做,画一个白圆就完事了,雪花下降也可以用一个运动渐变(以前看过一个下雨的效果就是这样做的),主要的还是雪花的出现位置,所以,我们就用了random(550)来随机选择一个y坐标,x坐标当然是0.这样纷纷扬扬的雪花就不再单调地"循环播放"了,而是永远没有重复.

好了,上面这么多废话算是引子,下面是正题.

我先说一下提纲,开始是介绍一下random()函数和Math.random()函数,然后介绍一些由此引出的自定义函数.对于如何实战出一些效果,那需要想象的翅膀和其它AS基础的支持.而算法本身并不困难.最后我会介绍一个简单效果.希望能启发读者的思维.

1、random(number)函数介绍

见帮助文档,简单再提一下,random(number)返回一个0~number-1之间的随机整数.参数number代表

一个整数.

示例:

<PRE class="codebox cy w30">trace(random(5));//复制到主场景第一帧.</PRE>

2、Math.random()

见帮助文档。返回一个有14位精度的0~1之间的数,注意没有参数。听说MM是推荐用这个函数的,而不是上面那个.个人觉得前一个还是好用一点.

示例:

<PRE class="codebox cy w30">trace(Math.random());//复制到主场景第一帧.</PRE>

3、自定义的函数

MM给我们的就这两个函数了,但是需求与供给总是存在矛盾。我们有时候需要的随机数可不是这么简单。比如我们想返回一个有两位小数的随机数,返回两个数之间的随机数,返回字母随机数,返回多个随机数等等,这些都需要我们自己编写函数来实现。下面的代码直接复制到主场景第一帧就可以调用了。注意有的函数需要入口参数。

# 返回一个共有n位数,其中m位是小数的随机数

<PRE class="codebox cy w30">function randomXiao(n,m){ var a = Math.pow(10, n+m); var b = random(a); return b=b/Math.pow(10, m);}</PRE>

大家可以用trace(randomXiao(3,2));来实验一下。这个函数是很简单的了。Math.pow(n,m)用于返回一个以n为底,m为指数的数。就是乘方啦!

# 返回一个n到m之间的随机数

<PRE class="codebox cy w30">function randomNm(n,m){ if(m>=n){ return random(m-n+1)+n; } else { return false; }}</PRE>

之所以用random(m-n+1)是因为随机数的范围是m-n,加上1使得m也能在里面。加上n保证随机数以n为下限。加上判断使函数更完整。另外,如果要返回一个负数随机数,也可以用randomNm(n,0);当然,我想更一般的是用-random(n);

# 返回一个字母

<PRE class="codebox cy w30">function randomAscii(){ var c = String.fromCharCode(random(26)+65); if(random(2)){ return c.toLowerCase(); } return c;}</PRE>

返回一个不区分大小写的随机字母

如果要返回大写,把if条件句去掉就行了。如果要返回小写,可以把条件句改为恒成立,或者去掉条件,最后一句改为:return c.toLowerCase(); String.fromCharCode(number)函数返回number代表数字的ASCII码。toLowerCase()用于将大写字母转为小写。

# 返回一个n到m之间的k个互异随机数

<PRE class="codebox cy w30">function randomKdiffer(n,m,k){ arrayK = []; var i = 0; while (i < k) { a = random(m-n+1)+n; for (var j = 0; j < i; j++) { if (a == arrayK[j]) { break; } } if (j == i) { arrayK[i] = a; i++; } } return arrayK;}</PRE>

数组arrayK中的元素即为所得值。注意到我们借用了random(m-n+1)+n来返回一个n~m的随机数。所以m本身也会被返回。如果要返回m以内的数,可以把n值改为0。如果要随机返回不确定个数,可以把入口参数的K值赋为k=random(m-n);随机返回不一定互异的数,把判断去掉就可以了,注意i++不要漏掉。这里不再给出。

#指定若干个字符/数字,然后从中随机返回一个(或多个)字符/数字,可以把原字符赋给一个数组,再根据数组的下标来决定返回值。这里不再举出函数,大家可以自己尝试。

#另需指出,对于随机设定一个MC的颜色值,我们较多采用mcColor.setRBG(random(0xFFFFFF));下面的例子中会有说明。如果要指定一个色域,可以采用上面给出的函数。如果对Color对象不太了解的可以查帮助,这里不作讨论。

以上函数算是由random直接衍生的,下面再举个例子,可以说是衍生函数的衍生函数,其中会直接用到上面给出的函数,请注意。

#返回一个指定长度的随机大写英文字符串

<PRE class="codebox cy w30">function randomString(n){ var arrayA = randomKdiffer(1, 26, n); var arrayB = ""; for (var i = 0; i < n; i++) { c=String.fromCharCode(arrayA[i]+64); /* if(random(2)){ c=c.toLowerCase(); } */ arrayB = arrayB+c; } return arrayB;}</PRE>

注意到StringCharCode方法,如果要写成小写,则把返回值写成arrayB.toLowerCase();如果返回一个不区分大小写的字符串,则把注释去掉.如果要返回一个不指定长度的字符串,则可以把入口参数赋值为random(n);这样只指定其上限.此函数也可以用randomAscii函数实现,留给大家自己思考.

#在几个区域中选出随机数

比如,在1~20,45~70这两段数之间选取一个随机数,

电脑资料

《random函数详解》()。因为区域数未定,所以直接用一个确定的函数编写多有不便,我们要使用的方法就是用switch语句进行定向,具体的我们给出一个函数,返回一个1~20,45~70内的数,其它区域读者请自行更改。

<PRE class="codebox cy w30">function randomArea(){ var a=random(2); switch(a){ case 0: return randomNm(1,20);break; case 1: return randomNm(45,70);break; }}</PRE>

注意,我们并没有写入口参数,而是直接在函数中就确定了是两段数,而且范围也是确定的。如果是三段,则改为a=random(3);同样增加一个case就可以了。当然,你也可以把第段数的范围设为入口参数,这里就不再举例了。但是这样做可能会使参数增多,我个人是不太喜欢一个需要很多参数的函数的。类似的,我们也可以随机返回一个字母段或几个字母段或者字母加数字段的一个数。方法也只是前几个函数的一个结合。这里仅举一例,返回指定的大写字母段的一个随机字母。提醒一下,小写字母的ASCII码a~z分别对应97~122.

<PRE class="codebox cy w60">function randomAArea(a,b){ if (ord(a) <= ord(b) && 65<=ord(a) && ord(b) <= 90) { return String.fromCharCode(randomNm(ord(a), ord(b))); } else { return false; }}</PRE>

其中用到一个函数ord(char),这是一个不推荐的函数.用于返回char字符的ASCII码。

如果大家想在任何地方调用函数,则需要稍稍变一下,把我们写的函数改变为全局函数.这样就可以不用标明路径而自如地向调用系统函数一样了.方法如下.例如:函数randomXiao如果要声明为全局函数,需要把第一行改为:

<PRE class="codebox cy w30">_global.randomXiao=function(n,m){//statment}</PRE>

对全局函数的概念不很清楚的朋友不用被这个名词吓倒. 这样改了函数第一行之后,在任何地方,比如在一个MC里,直接用(对,直接用,不用加_root路径了)randomXiao(n,m)就可以了.

有兴趣的朋友还可以根据这些函数衍生其它函数,比如一个有数字和英文字母的随机字符串.

说了这么多,为什么没有说Math.random()呢?

因为在下认为,这个方法太"专业"了,在普通做效果的过程中还是用random(n)好一点. MM为什么推荐我不得而知.

如果有朋友不清楚的,可以下载源文件看看.为了方便,源文件中的函数我全改成了全局函数.可以直接复制到你的作品中使用,当然,也可以写在外部文件.as中调用.

源文件下载

4.实例应用

想来想去,好像觉得实例也没什么好讲的,因为一旦讲起来,无外乎都必须是对语句的解说,算法的说明,没有什么闪光点,关键还是一个创意,另外就是基本功:对AS的熟悉程度了。但是为了完整性,我还是给出一个例子,里面的代码非常简单,图画我是没有天份,如果您有兴趣改造一下,我相信效果还是很不错的。

先来看看效果:

这个效果来源于一个网站上,而小条的颜色变化是我加的,因为正好说明一下setRGB的用法。

先把小条中的代码贴出:

<PRE class="codebox cy w30">onClipEvent (load) { i = 0; a = random(10)-5; if (a == 0) { a = 1; } col = new Color(this);}onClipEvent (enterFrame) { this._x += a; i++; if (i >= 36) { col.setRGB(random(0xFFFFFF)); a = random(10)-5; if (a == 0) { a = 1; } trace(a); i = 0; } if ((this._x+this._width) <= 0) { this._x = 550+this._width; } if ((this._x-this._width) > 550) { this._x = 0-this._width; }}</PRE>

可以看到,bar(小条太俗,改称bar)有两个事件方法,一个load,一个enterFrame。通常load用来初始化一些变量,事件是在MC被加载时触发的。而enterFrame则是每播放一帧就执行一次代码。先解释一下变量。i是控制帧数的。可以看到,因为每一帧都执行一次enterFrame中的代码,而其中有i++,所以这是用来记录已播放帧数的。a是用来设定速度的,因为在enterFrame中有this._x+=a;正如前面所说,enterFrame事件是指的MC每播放一帧都会执行一次其中的代码,所以每播放一帧bar的横坐标就会改变a个像素。col是一个颜色对象,作用是对MC的颜色进行改变。而col=new Color(this);意为定义这个对象,并把它与当前的MC对象建立关联。如果不好想象没有关系,下面我们会再提到。

需要再次指出,load事件是在MC加载时执行,所以只执行一次(你没有必要对同一个对象不停地加载吧?),而enterFrame是每一帧都会执行的,或者可以这么说:enterFrame中的代码会以帧率被执行。比如帧率为12,那么就每秒执行12次。运用它可以做出物体移动效果,或是更常用的,反弹球效果。不过这超出了我们的讨论范围了。

接下来是enterFrame中的代码。刚才已经说过,this._x+=a;与i++; ,这两个是主要的。后面的是条件控制语句。第一个if是判断已经播放的帧数,当播放了36帧时(这里正好三秒,注意,主就算MC本身只有一帧,或是主场景中只有一帧,enterFrame事件仍然在以帧率执行,所以上面的后一总解释更适当),重新确定MC的颜色:col.setRGB(random(0xFFFFFF));前面我们说过,col是一个颜色对象,而且已经与当前的MC关联,那么,col所代表的就是当前MC的颜色了。 这样说不知是不是更好理解。 而该对象有一个setRGB方法,可以设制MC的颜色值。这里我们使用16进制的随机数,而FFFFFF是颜色值中的最大值。随便说一下,FFFFFF是白色。 FF0000是红色。000000是黑色。

下面一句a=random(10)-5;是设定a的值,也就是MC的速度。当然,您可以使用我们定好的函数randomNm来规定一个范围,但是这里我不想再写一个函数。表达式是得到一个-5~4之间的随机数,之所以要有负数,是因为我们想出现那种可以左右移动的效果,而不是只向一个方向。

再下面两句是限定了移动的范围,如果超出了左右边界,就让它从另一端出来。

好了,看来我们写的那么多函数都没有用到。的确,这里是

没有用到,不过会有地方的。只要你肯让你的想象腾飞。

等等,还有一个圆轮的效果没有说呢!对不起,这个代码是留给您自己察看的,比第一个简单,因为我几乎是照搬了第一个的代码。

很多效果都必须是关于复制影片剪辑的,比如下雪下雨,复制出来后随机控制出现位置。这里也最好是用enterFrame来控制运动的路径。 但是复制不是我们所讲的重点,这里只是提醒您一下。另外,结合鼠标产生随机效果也是非常炫的,而制作通常是不复杂的。

用AS的随机+复制+循环炮制出一个星空,或者一群蚊子(只要您愿意)都是小菜。只要您懂得如何正确使用这些基本的语句。

源文件下载

相关文章

关于学校元旦放假的通知范文

关于2016年元旦及寒假放假安排的通知各部门:根据国务院办公厅通知精神,现将我校2016年元旦及寒假放假具体安排通知如下:一、元旦:2016年1月1日—3日放假,共3天。1月1日(星期五)放掉的课不补...
资料大全2012-05-08
关于学校元旦放假的通知范文

机关事业单位工作人员考勤管理办法全文(3)

四、有关要求(一) 各乡镇、各部门(单位)要加强对干部职工考勤工作的领导和管理,严肃劳动纪律,严格按照本办法做好本单位的考勤管理工作,并可结合本单位实际制定具体的考勤细则。(二) 各乡镇、各部门(单位...
资料大全2018-08-09
机关事业单位工作人员考勤管理办法全文(3)

鱿鱼的做法

鱿鱼怎样做才好吃呢,下面YJBYS小编为大家精心搜集了关于鱿鱼的做法大全,欢迎大家参考借鉴,希望可以帮助到大家!做法一:韭菜炒鱿鱼材料:鱿鱼(鲜)450克、韭菜249克、盐5克、料酒1...
资料大全2016-04-08
鱿鱼的做法

节能降耗实施方案

为确保事情或工作顺利开展,时常需要预先开展方案准备工作,方案是计划中内容最为复杂的一种。怎样写方案才更能起到其作用呢?以下是小编收集整理的节能降耗实施方案,供大家参考借鉴,希望可以帮助到有需要的朋友。...
资料大全2014-04-03
节能降耗实施方案

读报评报剪报

【摘 要】语文的外延等于生活的外延,而最能反映现实生活的就是报纸。因此在教学实践中,除了常规的名著阅读活动,我开展最多的就是读报活动。本文试从读报方法指导,报纸评点,剪报贴报、资料摘抄等活动来阐述我在...
资料大全2015-08-01
读报评报剪报

债务起诉书范文

债务起诉书如何写?以下是unjs小编收集的关于《债务起诉书》的范文,仅供参考!范文一:债务起诉书原告某某某,男,19××年××月×日生,×族,住所地上海市××区××路××号××室被告某某某,女,19...
资料大全2015-06-08
债务起诉书范文