190 votes

Comment obtenir un nombre d'éléments aléatoires à partir d'un tableau ?

Je travaille sur "comment accéder à des éléments de manière aléatoire à partir d'un tableau en javascript". J'ai trouvé de nombreux liens à ce sujet. Par exemple : Obtenir un élément aléatoire d'un tableau JavaScript

var item = items[Math.floor(Math.random()*items.length)];

Mais dans ce cas, nous ne pouvons choisir qu'un seul élément du tableau. Si nous voulons plus d'un élément, comment pouvons-nous y parvenir ? Comment obtenir plus d'un élément d'un tableau ?

0voto

Jared Wilber Points 763

Voici une fonction que j'utilise et qui permet d'échantillonner facilement un tableau avec ou sans remplacement :

  // Returns a random sample (either with or without replacement) from an array
  const randomSample = (arr, k, withReplacement = false) => {
    let sample;
    if (withReplacement === true) {  // sample with replacement
      sample = Array.from({length: k}, () => arr[Math.floor(Math.random() *  arr.length)]);
    } else { // sample without replacement
      if (k > arr.length) {
        throw new RangeError('Sample size must be less than or equal to array length         when sampling without replacement.')
      }
      sample = arr.map(a => [a, Math.random()]).sort((a, b) => {
        return a[1] < b[1] ? -1 : 1;}).slice(0, k).map(a => a[0]); 
      };
    return sample;
  };

Son utilisation est simple :

Sans remplacement (comportement par défaut)

randomSample([1, 2, 3], 2) peut revenir [2, 1]

Avec remplacement

randomSample([1, 2, 3, 4, 5, 6], 4) peut revenir [2, 3, 3, 2]

0voto

Manoj Rana Points 301
var getRandomElements = function(sourceArray, requiredLength) {
    var result = [];
    while(result.length<requiredLength){
        random = Math.floor(Math.random()*sourceArray.length);
        if(result.indexOf(sourceArray[random])==-1){
            result.push(sourceArray[random]);
        }
    }
    return result;
}

0voto

const items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'I', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 1, 2, 3, 4, 5];

const fetchRandomArray = ({pool=[], limit=1})=>{
let query = []
let selectedIndices = {}

while(query.length < limit){
    const index = Math.floor(Math.random()*pool.length)
    if(typeof(selectedIndices[index])==='undefined'){
        query.push(items[index])
        selectedIndices[index] = index
    }
}

console.log(fetchRandomArray({pool:items, limit:10})

0voto

Alan Omar Points 1810

Il n'est pas nécessaire de trier, il suffit de générer une longueur de sous-réseau aléatoire :

const myArray = ["January", "February", "March", "April", "May", "June", "July"];

const randomNumGenerator = () => Math.floor(Math.random() * myArray.length)

const result = [
  ...new Set(
    Array.from({
        length: randomNumGenerator() + 1
      },
      _ => myArray[randomNumGenerator()])
  )
]

console.log(result)

-2voto

Nivesh Saharan Points 157

Voici la réponse la plus correcte, qui vous donnera des éléments aléatoires et uniques.

function randomize(array, n)
{
    var final = [];
    array = array.filter(function(elem, index, self) {
        return index == self.indexOf(elem);
    }).sort(function() { return 0.5 - Math.random() });

    var len = array.length,
    n = n > len ? len : n;

    for(var i = 0; i < n; i ++)
    {
        final[i] = array[i];
    }

    return final;
}

// randomize([1,2,3,4,5,3,2], 4);
// Result: [1, 2, 3, 5] // Something like this

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X