js随机取数问题

一个30个数的数组,每次随机取6位,总共取5次,全部取完,也是为了让每个数字都取到。5次之后又重新开始取数
用JavaScript实现。

阅读 2.5k
4 个回答

你看这个符合要求?

let arr = [],
    i = 0;

while (i < 30) {
    arr.push(i);
    i++;
}

//console.log(arr);//案例

function getRandomNum(arr, len) {
    return {
        arr,
        len,
        count: 0,
        shuffleArr: [],
        shuffle: function(arr) {
            let result = [],
                tempArr = arr.slice(0),
                i = 0;

            while (i < tempArr.length) {
                let index = parseInt([Math.random()] * (tempArr.length - 1));
                result.push(tempArr[index]);
                tempArr.splice(index, 1);
            }

            return result;
        },
        getNum: function() {

            if (this.count === 0) {
                this.shuffleArr = this.shuffle(this.arr);
            } else if (this.count === this.len - 1) {
                this.shuffleArr = this.shuffle(this.arr);
                this.count = 0;
            }

            let start = this.count * this.len;
            this.count++;
            return this.shuffleArr.slice(start, start + this.len);

        }
    };
}

let arrAccessor = getRandomNum(arr, 6);

console.log(arrAccessor.getNum());// 打乱取前六个
console.log(arrAccessor.getNum());//取后面六个
console.log(arrAccessor.getNum());//取后面六个
console.log(arrAccessor.getNum());//取后面六个
console.log(arrAccessor.getNum());//取最后六个
console.log(arrAccessor.getNum());// 重新打乱取前六个

把1~30这个数组乱序, 然后每次取前六个就行了
乱序函数叫shuffle,实现很多,可以看看underscore的实现

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge, chrome=1">
    <title></title>
</head>

<body>
    <script>
        var test = [];
        for(var i=0;i<30;i++){
            test.push(i);
        }
        function randomGet(arr,times){
            if(times<=0){
                return;
            }
            var tempArr = arr.slice(0);
            var aver = tempArr.length/times;
            var ind;
            for(var j =0;j<times;j++){
                var temp=[];
                for(var i=0;i<aver;i++){
                    ind =parseInt(Math.round(Math.random())*(tempArr.length-1));
                    temp.push(tempArr[ind]);
                    tempArr.splice(ind,1);
                }
                console.log(temp)
            }        
        }
        randomGet(test,5);
    </script>
</body>

</html>
const iterate = (time, xs) => {
    if (!time) {
        return;
    }
    const dict = {};
    xs.forEach((e, i) => dict[i] = e);
    let ys = [];
    while (Object.keys(dict).length) {
        const keys = Object.keys(dict);
        const randomKey = keys[~~(Math.random() * keys.length)];
        const number = dict[randomKey];
        delete dict[randomKey];
        ys.push(number);
        if (ys.length == 6) {
            console.log(ys);
            ys = [];
        }
    }
    iterate(time - 1, xs);
}
var xs = Array(30).fill(0).map((_, i) => i + 1);
iterate(10, xs);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题