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

(预备口试,多看点题。来自雨夜带刀’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 排序的机能消耗会更大,由于须要遍历全部数组,而随机抽取的话,不须要对全部数组举行遍历,故其机能会更好。

    原文作者:JingDing
    原文地址: https://segmentfault.com/a/1190000002459277
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞