Math.random()中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数,在种子数的基础上进行一定的交换,从而产生需要的随机数字。在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,游戏程序中的物品掉落,抽奖程序等。
废话少说直接上代码:
package
{
import flash.display.Sprite;
public class RandomTest extends Sprite
{
public function RandomTest()
{
//50%几率 出现 10,40%几率出现 5,10%几率出现 1;
//Math.random() 返回一个伪随机数 n,其中 0 <= n < 1
var n :int;//随机数字
var m :int;//结果数字
var resArr :Array = [0,0,0];//结果数组统计
for(var i :int = 0;i < 1000;i++)
{
n = Math.random() * 100;
if(n < 50)50个数字的区间,50%的几率
{
m = 10;
resArr[0]++;
}
else if(n < 90)//[50,90),40个数字的区间,40%的几率
{
m = 5;
resArr[1]++
}
else//其他
{
m = 1;
resArr[2]++
}
}
trace(resArr);
}
}
}
通过测试可以看出,10,5,1 出现的几率基本上与预想的500,400,100很接近,基本可以达到了要求.
有时候当我们的游戏人物遇敌时,我们需我怪物随机根据概率选择处理方式,如下:
1、50%的机会友好的问候
2、25%的几率走开
3、10%的机会立即攻击
4、10%的机会提供金钱作为礼物
5、5%的机会跳钢管舞
下面的这个算法就是跟据概率数组,返回选择的概率索引号。
(as3 实现)
package
{
import flash.display.Sprite;
public class Test extends Sprite
{
public function Test()
{
var probs :Array = [50,25,10,10,5];
for(var i:int = 0;i<10;i++)
{
var resI :int = Choose(probs);
trace(resI);
}
}
private function Choose(probs :Array):int
{
var total :int = 0;
//首先计算出概率的总值,用来计算随机范围
for(var i:int=0;i<probs.length;i++)
{
total+=probs[i];
}
var rd :int = Math.random() * total;
for(var j:int=0;j<probs.length;j++)
{
if(rd<probs[j])
{
return j;
}
else
{
rd-=probs[j];
}
}
return probs.length-1;
}
}
}