Question Obtenir une valeur aléatoire à partir d'un tableau JavaScript


Considérer:

var myArray = ['January', 'February', 'March'];    

Comment puis-je sélectionner une valeur aléatoire de ce tableau en utilisant JavaScript?


501
2017-12-29 00:04


origine


Réponses:


var rand = myArray[Math.floor(Math.random() * myArray.length)];

970
2017-12-29 00:06



J'ai trouvé encore plus simple d'ajouter une fonction prototype à la classe Array:

Array.prototype.randomElement = function () {
    return this[Math.floor(Math.random() * this.length)]
}

Maintenant, je peux obtenir un élément de tableau aléatoire en tapant simplement:

var myRandomElement = myArray.randomElement()

Notez que cela ajoutera une propriété à tous les tableaux, donc si vous en passez une par for..in Tu devrais utiliser .hasOwnProperty():

for (var prop in myArray) {
    if (myArray.hasOwnProperty(prop)) {
        ...
    }
}

(Cela peut ou peut ne pas être un tracas pour vous.)


75
2017-08-19 10:34



Si vous avez déjà souligner ou lodash inclus dans votre projet, vous pouvez utiliser _.sample.

// will return one item randomly from the array
_.sample(['January', 'February', 'March']);

Si vous devez obtenir plus d'un élément au hasard, vous pouvez le transmettre en tant que second argument dans le tiret bas:

// will return two items randomly from the array using underscore
_.sample(['January', 'February', 'March'], 2);

ou utilisez le _.sampleSize méthode dans lodash:

// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);

43
2018-06-19 18:40



Supposons que vous vouliez choisir un élément aléatoire différent de la dernière fois (pas vraiment aléatoire, mais toujours une exigence commune) ...

En nous appuyant sur la réponse de @Markus, nous pouvons ajouter une autre fonction prototype:

Array.prototype.randomDiffElement = function(last) {
   if (this.length == 0) {
      return;
   } else if (this.length == 1) {
      return this[0];
   } else {
      var num = 0;
      do {
         num = Math.floor(Math.random() * this.length);
      } while (this[num] == last);
      return this[num];
   }
}

Et mettre en œuvre comme ça:

var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement)

17
2017-08-14 01:57



Méthode prototype

Si vous prévoyez d'obtenir une valeur aléatoire, vous pouvez définir une fonction pour celle-ci.

Tout d'abord, mettez ceci dans votre code quelque part:

Array.prototype.sample = function(){
  return this[Math.floor(Math.random()*this.length)];
}

À présent:

[1,2,3,4].sample() //=> a random element

Code publié dans le domaine public en vertu de la Licence CC0 1.0.


15
2017-11-24 23:52



Si vous avez des valeurs fixes (comme une liste de noms de mois) et que vous voulez une solution d'une ligne

var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]

La deuxième partie du tableau est une opération d'accès telle que décrite dans Pourquoi [5,6,8,7] [1,2] = 8 dans JavaScript?


7
2017-11-28 14:58



La version la plus courte:

var myArray = ['January', 'February', 'March']; 
var rand = myArray[(Math.random() * myArray.length) | 0]

7
2017-07-19 02:37



~~ est beaucoup plus rapide que Math.Floor(), donc quand il s'agit d'optimisation des performances tout en produisant des résultats en utilisant des éléments d'interface utilisateur, ~~ gagne le match. PLUS D'INFORMATIONS

var rand = myArray[~~(Math.random() * myArray.length)];

Mais si vous savez que le tableau va avoir des millions d'éléments que vous pourriez vouloir reconsidérer entre l'opérateur Bitwise et Math.Floor(), en tant qu'opérateur bitwise se comportent bizarrement avec de grands nombres. Voir ci-dessous l'exemple expliqué avec la sortie. PLUS D'INFORMATIONS

var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343

5
2018-05-05 12:25