资讯专栏INFORMATION COLUMN

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

tigerZH / 1723人阅读

摘要:准备面试,多看点题。来自雨夜带刀需求描述从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现。

(准备面试,多看点题。来自雨夜带刀"s Blog)

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

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 排序的性能损耗会更大,因为需要遍历整个数组,而随机抽取的话,不需要对整个数组进行遍历,故其性能会更好。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87688.html

相关文章

  • JavaScript算法题之–查找不同顺序排列字符串

    摘要:来自雨夜带刀需求描述从一组数组中找出一组按不同顺序排列的字符串的数组元素。最后用编码和作为对象的来保存编码和一致的字符串。方法方法是将字符串转换成数组后再对数组进行排序,和使用排序后会变成,将拍好序的字符串作为对象的来保存排序一致的字符串。 (准备面试,多看点题。来自雨夜带刀s Blog ) 需求描述:从一组数组中找出一组按不同顺序排列的字符串的数组元素。假如有这样一个数组: [ ...

    zhjx922 评论0 收藏0
  • python面试题之“该死for循环系列”(一)

    摘要:这是一道魔性面试题,难倒了无数英雄好汉上面代码的执行顺序是这样的从上到下第一个函数就是实现了一个简单的加法运算第二个函数是一个生成器函数,如果调用它会返回一个生成器这一行调用了生成器函数,所以此刻就是一个生成器它的本质还是迭代器然后执行循环 这是一道魔性面试题,难倒了无数英雄好汉…… def add(n,i): return n+i def test(): for i...

    wudengzan 评论0 收藏0
  • JS算法题之leetcode(1~10)

    摘要:先去空白,去掉空白之后取第一个字符,判断正负符号,若是英文直接返回,若数字则不取。回文数题目描述判断一个整数是否是回文数。回文数是指正序从左向右和倒序从右向左读都是一样的整数。 JS算法题之leetcode(1~10) 前言 一直以来,前端开发的知识储备在数据结构以及算法层面是有所暂缺的,可能归根于我们的前端开发的业务性质,但是我认为任何的编程岗位都离不开数据结构以及算法。因此,我作为...

    SoapEye 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<