Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数组中随机选择对_Javascript_Arrays - Fatal编程技术网

Javascript 从数组中随机选择对

Javascript 从数组中随机选择对,javascript,arrays,Javascript,Arrays,我有一个类似的数组 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 我想按顺序抓取并推送这些条目的随机数,并将它们推送到一个新数组中,直到达到一个极限 i、 例如,如果我输入5,它会将随机条目排序到一个新数组中,如 [1,4,7,10,12] 我试过了 var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; var newArr = [], num, roll; //

我有一个类似的数组

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

我想按顺序抓取并推送这些条目的随机数,并将它们推送到一个新数组中,直到达到一个极限

i、 例如,如果我输入5,它会将随机条目排序到一个新数组中,如

[1,4,7,10,12]

我试过了

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var newArr = [], num, roll;
//remove number from array
for(var i =0; i < arr.length; i++) {
num = Math.floor(Math.random() * arr.length);
newArr.push(arr[num]);
roll = arr.splice(num, 1);
}

但它并没有真正返回我所需要的,因为我需要保留订单。如果有帮助的话,我使用下划线?

只是为了在这里提供帮助-您可能应该像上面的@Eric链接那样做

function getRandomSubarray(arr, size) {
    var shuffled = arr.slice(0), i = arr.length, min = i - size, temp, index;
    while (i-- > min) {
        index = Math.floor(i * Math.random());
        temp = shuffled[index];
        shuffled[index] = shuffled[i];
        shuffled[i] = temp;
    }
    return shuffled.slice(min);
}

var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

var newArr = getRandomSubarray(x, 6).sort(function(a,b) { return a - b } );

console.log(newArr)
这应该会返回您正在寻找的内容。虽然这对我来说太大了。使用下划线

还有一个选择:

function getRandomSorted(arr, limit) {

  limit = limit || 1;
  var random = [];

  for (var i=0; i<limit; i++) {
    var rand = arr[0|Math.random() * arr.length];
    if (~random.indexOf(rand)){ --i; continue; }
    random.push(rand);
  }

  return random.sort(function(a,b){ return a-b });
}

getRandomSorted(arr, 5);

这将适用于字符串和数字。

我认为这就是您试图实现的目标。使用稀疏数组并维护原始元素索引。使用等于或大于所提供数组长度的count属性将返回该数组的副本

Javascript

/*jslint maxerr: 50, indent: 4, browser: true, bitwise: true */
/*global console */

(function () {
    "use strict";

    function customRand(array, count) {
        var length = array.length,
            indexes = [],
            result = [],
            i = 0,
            rand,
            temp;

        while (i < length) {
            if (Object.prototype.hasOwnProperty.call(array, i)) {
                indexes.push(i);
            }

            i += 1;
        }

        i = 0;
        length = indexes.length;
        while (i < length) {
            rand = (Math.random() * i) | 0;
            temp = indexes[i];
            indexes[i] = indexes[rand];
            indexes[rand] = temp;
            i += 1;
        }

        indexes = indexes.slice(0, count).sort(function (a, b) {
            return a - b;
        });

        i = 0;
        length = indexes.length;
        while (i < length) {
            result[indexes[i]] = array[indexes[i]];
            i += 1;
        }

        return result;
    }

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

    console.log(customRand(arr, 5));
}());

好的,你能用javascript提供一个解决方案吗?因此,它对站点成员仍然有用。您的公式更像是一个柏林噪声随机公式,因此您也可以通过随机跳转i来绘制数组条目,直到所需数组已满,然后对其进行排序。那么,您是否允许重复值?例如,[1,2,2,10,17]是有效结果吗?也就是说,如果所需的随机数组的长度应为20,则它与原始数组没有差异,对稀疏数组不起作用,如果使用此变量x=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],则顺序不正确。相反;你在开玩笑吧?OP什么时候要求的?阅读问题并回答答案。我为什么要开玩笑?在什么时候他没有?您只需添加注释等信息,您的答案就会得到改进。我已经做了。你认为他所说的成对或数组是什么意思,我需要命令才能留下来?诚然,OP的问题并不十分清楚,但这并不意味着我们的答案不必如此。此外,您甚至可以提供有关您正在使用的洗牌的背景/链接信息,Fisher–Yates事实上我也可以这样做,但我认为这是多余的。如果使用此变量x=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],则无法使用稀疏数组,并且没有正确的顺序;我看不出你从哪里得到这些需求,正如OP的例子所示。无论如何,问题已经结束了。标题中的单词对,一个数组,如,我给出的也是,我需要保留顺序,除非数组排序开始,否则排序将更改顺序。但是是的,这个问题被标记为一个重复的问题,但我认为它与前面提到的问题不一样。
/*jslint maxerr: 50, indent: 4, browser: true, bitwise: true */
/*global console */

(function () {
    "use strict";

    function customRand(array, count) {
        var length = array.length,
            indexes = [],
            result = [],
            i = 0,
            rand,
            temp;

        while (i < length) {
            if (Object.prototype.hasOwnProperty.call(array, i)) {
                indexes.push(i);
            }

            i += 1;
        }

        i = 0;
        length = indexes.length;
        while (i < length) {
            rand = (Math.random() * i) | 0;
            temp = indexes[i];
            indexes[i] = indexes[rand];
            indexes[rand] = temp;
            i += 1;
        }

        indexes = indexes.slice(0, count).sort(function (a, b) {
            return a - b;
        });

        i = 0;
        length = indexes.length;
        while (i < length) {
            result[indexes[i]] = array[indexes[i]];
            i += 1;
        }

        return result;
    }

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

    console.log(customRand(arr, 5));
}());