巧用原生API生成多个不相等的随机数

数组操作在所有的语言中,都占有一个很重要的位置,比如,生成一定数量的不重复的随机数。关于生成随机数的问题,可以应用在比如等概率抽奖等相关功能。本篇文章就记录两个比较不错的生成随机数的方法。

生成随机数的方法应该是有很多的,这里只说明两种我认为比较好的方法吧:

方法1:利用数组操作实现

  • 1:生成一个数组集合arr1,数组长度为取值范围,最小值为arr1[0] = 0;
  • 2:定义一个空数组res = [],用来存储最后生成的随机数组。
  • 3:根据arr1的长度,生成一个随机值,len = Math.floor(arr1.length*Math.random()),这个值在arr1数组中,肯定会有一个对应的数组。
  • 4:从arr1数组中,取出第len个元素,arr1[len],并且把取出的该值,保存到res数组中,res.push(arr1[len]);
  • 5:在arr1数组中,删除第len个元素,使得新的数组,不再含有arr1[len]这个数值
  • 6:循环,从第三步进行下一轮的循环,直到res数组的长度等于num时(最后需要的随机数的个数),结束循环。
  • 7:输出res,即为一个随机的数组。

代码:


function createRandomNumber_1(num,maxNum){
    if(!maxNum || !num){
	alert("please input two Number");
	return false;
    }

    var flag = 0,
	i=0,
	arrLen=0,
	ran=0,
	arr=[],
	res=[];
	
    if(maxNum - num < 0){
	flag = maxNum;
	maxNum = num;
	num = flag;
    }
	
    for(;i<maxNum;i++){
	arr[i] = i-0+1;
    }
	
    arr.length = maxNum;
    flag = 0;
    while(num > flag){
	arrLen = arr.length;
	ran = Math.floor(arrLen*Math.random());
	res.push(arr.splice(ran,1)[0]);
	flag++;
    }
	
    return res;
}


方法2:巧用JS原生的API实现生成随机数

  • 1:生成一个数组集合arr:,数组长度为取值范围,最小值为arr[0] = 0;
  • 2:使用sort方法,对arr进行一个随机排序。
  • 3:arr.length限制arr的长度
  • 4:输出arr,即为生成的随机数。

代码:


function createRandomNumber_2(num,maxNum){
    if(!maxNum || !num){
	alert("please input two Number");
	return false;
    }
	
    var flag = 0,
	i=0,
	arr=[];
	
    if(maxNum - num < 0){
	flag = maxNum;
	maxNum = num;
	num = flag;
    }
	
    for(;i<maxNum;i++){
	arr[i] = i-0+1;
    }
	
    arr.sort(function(p1,p2){
    	return 0.5-Math.random();
    });
     
    //上面这段代码,就是该思想的核心。
    arr.length = num;
    return arr;
}


这个方法,是再别处看到的,当时给我的印象简直太大的了,从来没有想象到,还可以这样实现,很好很强大。
该方法的帖子:js随机生成0-51之间30个不同的数字,以前也在CSDN上,写过一篇:在一定范围内,随机生成N个不等的数组

测试一下吧

范围数表示随机数的可选择范围,选择数为最后生成随机数的个数

注:请保证范围数的数值,要大于选择数的数值
注:如果想要看性能时间问题,可以把范围数设置大于10000,选择数大于100就能很明显的看出优劣了。

或者您可以直接点击去目标页面,demo

不得不说,巧用原生的API真的可以完成一些不可思议的功能。这也算是保存一下吧。

来碰个运气,摇奖

添加一个随机摇奖的小示例,默认的随机数范围是1-100,其中尾数为6的数字,出现的概率是其他数字的0.1倍,可以选择重复性摇奖,也可以选择不重复性摇奖。试试呗。

这个demo的地址,代码查看方法直接右键即可,你懂得。

本文地址:http://www.zhangyunling.com/?p=114

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>