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

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

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

1var arr = [],
2    length = 100,
3    i = 0;
4 
5for( ; i < length; i++ ){
6    arr.push( i );
7}

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

方法1:随机抽取法

01var gRandomArr = function( arr, length ){
02    var newArr = [],
03        i = 0,
04        index;
05 
06    for( ; i < length; i++ ){
07        // 利用数组长度生成随机索引值
08        index = parseInt( Math.random() * arr.length );
09        // 将随机索引对应的数组元素添加到新的数组中
10        newArr.push( arr[index] );
11        // 删除原数组中随机生成的元素
12        arr.splice( index, 1 );
13    }
14 
15    return newArr;
16};
17 
18// 调用
19gRandomArr( arr, 10 );

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

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

01var gRandomArr = function( arr, length ){
02    // 使用sort将原数组的顺序打乱,让有序变成无序
03    arr.sort(function(){
04        return Math.random() - 0.5;
05    });
06 
07    // 从原数组中一次性返回10个元素
08    return arr.slice( 0, length );
09};
10 
11// 调用
12gRandomArr( arr, 10 );

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

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

转载于:https://www.cnblogs.com/lmy-ms/articles/3820790.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值