雨夜带刀's Blog

JavaScript算法题之–随机数的生成

需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现。

先来生成一个有序的数组:

var arr = [],
	length = 100,
	i = 0;

for( ; i < length; i++ ){
	arr.push( i );
}

从一个长度为 100 的有序数组中随机拿出 10 个随机的数,并且不能有重复。

方法1:随机抽取法

var gRandomArr = function( arr, length ){
	var newArr = [],
		i = 0,
		index;

	for( ; i < length; i++ ){
		// 利用数组长度生成随机索引值
		index = parseInt( Math.random() * arr.length );
		// 将随机索引对应的数组元素添加到新的数组中
		newArr.push( arr[index] );
		// 删除原数组中随机生成的元素
		arr.splice( index, 1 );
	}

	return newArr;
};

// 调用
gRandomArr( arr, 10 );

方法1主要是采用基于数组本身的长度去生成随机的索引值,然后将索引值对应的数组元素添加到随机数组中,由于不能有重复,在添加好后将删除原数组的元素。

方法2:随机打乱原数组的顺序,然后再一次性返回

var gRandomArr = function( arr, length ){
	// 使用sort将原数组的顺序打乱,让有序变成无序
	arr.sort(function(){
        return Math.random() - 0.5;
    });

    // 从原数组中一次性返回10个元素
	return arr.slice( 0, length );
};

// 调用
gRandomArr( arr, 10 );

方法2采用的办法是先打乱原数组的顺序,但这里需要用到 sort 来对原数组进行排序,如果数组长度较大的话,sort 排序的性能损耗会更大,因为需要遍历整个数组,而随机抽取的话,不需要对整个数组进行遍历,故其性能会更好。

原载于:雨夜带刀's Blog
本文链接:http://stylechen.com/grandomarr.html
如需转载请以链接形式注明原载或原文地址。

“JavaScript算法题之–随机数的生成”目前已有 6 条评论

发表评论:

  • *
  • *
头像

雨夜带刀

前端开发工程师,技术宅,现居北京。

雨夜带刀的开源项目

easy.js
一个简洁的 JavaScript 类库,集成了模块加载器,同时也有包含了常见的的组件库,可访问项目网站
seed
符合 AMD 规范的 JavaScript 模块加载器。
ecope
从 easy.js 组件库中移值过来的基于 jQuery 的组件库,简单实用,API 风格统一。