Mr.Crazy

一切隨緣,戰勝自己。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
random函数详解[转]2007-04-14 13:43开始是介绍一下random()函数和Math.random()函数,然后介绍一些由此引出的自定义函数.对于如何实战出一些效果,那需要想象的翅膀和其它AS基础的支持.而算法本身并不困难.最后我会介绍一个简单效果.希望能启发读者的思维. 1、random(number)函数介绍 见帮助文档,简单再提一下,random(number)返回一个0~number-1之间的随机整数.参数number代表 一个整数. 示例: trace(random(5)); //复制到主场景第一帧. 2、Math.random() 见帮助文档。返回一个有14位精度的0~1之间的数,注意没有参数。听说MM是推荐用这个函数的,而不是上面那个. 示例: trace(Math.random()); //复制到主场景第一帧. 3、自定义的函数 MM给我们的就这两个函数了,但是需求与供给总是存在矛盾。我们有时候需要的随机数可不是这么简单。 比如我们想返回一个有两位小数的随机数,返回两个数之间的随机数,返回字母随机数,返回多个随机数等等, 这些都需要我们自己编写函数来实现。下面的代码直接复制到主场景第一帧就可以调用了。注意有的函数需要入口参数。 # 返回一个共有n位数,其中m位是小数的随机数 function randomXiao(n,m){ var a = Math.pow(10, n+m); var b = random(a); return b=b/Math.pow(10, m); } 可以用trace(randomXiao(3,2));实验一下。这个函数简单。Math.pow(n,m)用于返回一个以n为底,m为指数的数。乘方! # 返回一个n到m之间的随机数 function randomNm(n,m){ if(m>=n){ return random(m-n+1)+n; } else { return false; } } 之所以用random(m-n+1)是因为随机数的范围是m-n,加上1使得m也能在里面。加上n保证随机数以n为下限。 加上判断使函数更完整。另外,如果要返回一个负数随机数,也可以用randomNm(n,0);当然,我想更一般的是用-random(n); # 返回一个字母 function randomAscii(){ var c = String.fromCharCode(random(26)+65); if(random(2)){ return c.toLowerCase(); } return c; } 返回一个不区分大小写的随机字母 如果要返回大写,把if条件句去掉就行了。如果要返回小写,可以把条件句改为恒成立,或者去掉条件,最后一句改为: return c.toLowerCase(); String.fromCharCode(number)函数返回number代表数字的ASCII码。 toLowerCase()用于将大写字母转为小写。 # 返回一个n到m之间的k个互异随机数 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; } 数组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直接衍生的,下面再举个例子,可以说是衍生函数的衍生函数,其中会直接用到上面给出的函数,请注意。 #返回一个指定长度的随机大写英文字符串 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; } 注意到StringCharCode方法,如果要写成小写,则把返回值写成arrayB.toLowerCase();如果返回一个不区分大小写的字符串, 则把注释去掉.如果要返回一个不指定长度的字符串,则可以把入口参数赋值为random(n);这样只指定其上限.此函数也可以用 randomAscii函数实现,留给大家自己思考. #在几个区域中选出随机数 比如,在1~20,45~70这两段数之间选取一个随机数。因为区域数未定,所以直接用一个确定的函数编写多有不便, 我们要使用的方法就是用switch语句进行定向,具体的我们给出一个函数,返回一个1~20,45~70内的数,其它区域读者请自行更改。 function randomArea(){ var a=random(2); switch(a){ case 0: return randomNm(1,20);break; case 1: return randomNm(45,70);break; } } 注意,我们并没有写入口参数,而是直接在函数中就确定了是两段数,而且范围也是确定的。如果是三段,则改为a=random(3); 同样增加一个case就可以了。当然,你也可以把第段数的范围设为入口参数,这里就不再举例了。但是这样做可能会使参数增多, 我个人是不太喜欢一个需要很多参数的函数的。类似的,我们也可以随机返回一个字母段或几个字母段或者字母加数字段的一个数。 方法也只是前几个函数的一个结合。这里仅举一例,返回指定的大写字母段的一个随机字母。 提醒一下,小写字母的ASCII码a~z分别对应97~122. 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; } } 其中用到一个函数ord(char),这是一个不推荐的函数.用于返回char字符的ASCII码。 如果大家想在任何地方调用函数,则需要稍稍变一下,把我们写的函数改变为全局函数.这样就可以不用标明路径而自如地向调用系统 函数一样了.方法如下.例如:函数randomXiao如果要声明为全局函数,需要把第一行改为: _global.randomXiao=function(n,m){ //statment } 对全局函数的概念不很清楚的朋友不用被这个名词吓倒. 这样改了函数第一行之后,在任何地方,比如在一个MC里,直接用(对,直接用,不用加_root路径了)randomXiao(n,m)就可以了.
posted on 2007-06-12 09:57  JonyJaJa  阅读(652)  评论(0编辑  收藏  举报