从Array到新数组的随机选择

时间:2016-09-30 00:23:17

标签: javascript arrays math

我在这里看到了这个问题answered,但我还有一个相关的问题。

我试图实现:

同样的事情,但是,如果输出是一个多于1个数字的选择,如果你只想要返回一个值,上面的工作正常。

如何在这种情况下将(x)输出量#7返回到新的var或数组......?关于最佳实践的一些指导也将受到赞赏;)

非常感谢......

只为了好玩, 目的:

创建一个小小的weenie web应用程序,它将[1 - 49]范围内的7个变量数字返回到数组中。 ` 想一想返回乐透号码列表 使用_underscore.js [Sample function]

从选择中创建新数组

****我知道这更容易,但我试图获得理解 使用Vanilla JS来实现这个目标

_。样本([1,2,3,4,5,6],3); => [1,6,2]

var getLoot = Array.from(Array(50).keys()) // Create array of 49 numbers.
console.info(getLoot);
var pick = getLoot[Math.floor(Math.random() * getLoot.length)];

pick; 

// pick返回一个单独的,如果你想要一个,但是,.. //我想要这样的东西:

var pick = function() {
    // code that will return 7 numbers from the array into a new Array
    // will randomize every time pick is called...
}

4 个答案:

答案 0 :(得分:2)

如果您想要返回超过1个值,则可以将结果存储到an array等数据结构中。这是问题的解决方案 假设您可以将50个数字的数组传入pick()函数。:

var getRandomArbitrary = function(min, max) {
    return Math.floor(Math.random() * (max - min) + min);
}

var pick = function(fiftyNumberArray, numberOfValuesWanted) {
    var randomNums = [];
    for(var i = 0; i < numberOfValuesWanted; i++) {
        randomNums.push(
            fiftyNumberArray[getRandomArbitrary(0, 50)]
        );
    }
    return randomNums;
};

var fiftyNumbers = [] // <- set your array of fifty numbers
pick(fiftyNumbers, 7);

Javascript的Math.random()将返回0到1之间的值(不包括)。因此,要将索引缩放到正确的值以查看数组,您可能希望将其乘以公式(max - min) + min

答案 1 :(得分:0)

这可能是你想要的。

$(function() 
{
    var lol = [1,4,5,6,7,8,9];
    function getPart(array,number)
    {
        var part = [],
            index;
        while(true)
        {
            if(part.length == number)
            {
                break;
            }
            index = $.random(0,part.length);
            part.push(lol.splice(index,1));

        }
        return part;
    }
});
$.random = function(min,max,filter)
{

    var i,
        n = Math.floor(Math.random()*(max-min+1)+min);
    if(filter != undefined && filter.constructor == Array)
    {
        for(i=filter.length-1;i>-1;i--)
        {
            if(n == filter[i])
            {
                n = Math.floor(Math.random()*(max-min+1)+min)
                i = filter.length;
            }
        }
    }
    return n;
}

答案 2 :(得分:0)

您可以使用Array.prototype.splice()Math.floor()Math.random()for循环从输入数组中删除元素,从输入数组返回包含伪随机拾取索引的数组,而不重复索引被选中。

function rand(n) {
  var res = []; var a = Array.from(Array(n).keys()); 
  for (;a.length;res.push(a.splice(Math.floor(Math.random()*a.length),1)[0]));
  return res
}

console.log(rand(50));

答案 3 :(得分:0)

完成这项工作的一个好方法是改组数组并选择第一个n值。如;

&#13;
&#13;
function shuffle(a){
  var i = a.length,
      j,
    tmp;
  while (i > 1) {
    j = Math.floor(Math.random()*i--);
    tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
  }
  return a;
};
var arr = Array(50).fill().map((_,i) => i+1); //[1,2,3...49,50]
randoms = shuffle(arr).slice(0,7)             // to get 7 random numbers from arrary arr
console.log(randoms)
&#13;
&#13;
&#13;