Obtendo um valor random de um array JavaScript

Considerar:

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

Como posso selecionar um valor random deste array usando JavaScript?

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

Eu achei ainda mais simples adicionar uma function protótipo à class Array:

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

Agora eu posso pegar um elemento random de array apenas digitando:

 var myRandomElement = myArray.randomElement() 

Note que isso irá adicionar uma propriedade a todos os arrays, então se você estiver usando um loop for..in você deve usar .hasOwnProperty() :

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

(Isso pode ou não ser um aborrecimento para você.)

Se você já tem sublinhado ou lodash incluído no seu projeto, você pode usar _.sample .

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

Se você precisar obter mais de um item aleatoriamente, você pode passar isso como um segundo argumento no sublinhado:

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

ou use o método _.sampleSize no lodash:

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

Digamos que você queira escolher um item random que seja diferente da última vez (não é realmente random, mas ainda é um requisito comum) …

Com base na resposta de @Markus, podemos adicionar outra function de protótipo:

 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]; } } 

E implemente da seguinte forma:

 var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement) 

Método de Protótipo

Se você planeja obter um valor random muito, você pode querer definir uma function para ele.

Primeiro, coloque isso no seu código em algum lugar:

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

Agora:

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

Código liberado para o domínio público sob os termos da licença CC0 1.0 .

A versão mais curta:

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

Se você tiver valores fixos (como uma lista de nomes de mês) e quiser uma solução de uma linha

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

A segunda parte da matriz é uma operação de access, conforme descrito em Por que [5,6,8,7] [1,2] = 8 em JavaScript?

~~ é muito mais rápido que Math.Floor() , então quando se trata de otimização de performance enquanto produz saída usando elementos de UI, ~~ ganha o jogo. MAIS INFORMAÇÕES

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

Mas se você souber que o array terá milhões de elementos do que você pode querer reconsiderar entre o Operador Bitwise e o Math.Floor() , como o operador bit a bit se comporta de forma estranha com números grandes. Veja abaixo o exemplo explicado com a saída. MAIS INFORMAÇÕES

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

Se você quiser escrevê-lo em uma linha, como a solução de Pascual, outra solução seria escrevê-lo usando a function find do ES6 (baseado no fato de que a probabilidade de selecionar aleatoriamente um dos n itens é 1/n ):

 var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i)); console.log(item); 

Isto é similar, mas mais geral que, a solução do @Jobob Relkin:

Este é o ES2015:

 const randomChoice = arr => { const randIndex = Math.floor(Math.random() * arr.length); return arr[randIndex]; }; 

O código funciona selecionando um número random entre 0 e o comprimento da matriz e, em seguida, retornando o item nesse índice.

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

ou versão menor equivalente:

var item = myArray[(Math.random()*myArray.length)|0];

Código de amostra:

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

Função simples:

 var myArray = ['January', 'February', 'March']; function random(array) { return array[Math.floor(Math.random() * array.length)] } random(myArray); 

OU

 var myArray = ['January', 'February', 'March']; function random() { return myArray[Math.floor(Math.random() * myArray.length)] } random(); 

OU

 var myArray = ['January', 'February', 'March']; function random() { return myArray[Math.floor(Math.random() * myArray.length)] } random(); 

Eu encontrei uma maneira de contornar as complicações da resposta principal, apenas concatenando a variável rand em outra variável que permite que esse número seja exibido dentro da chamada de myArray [] ;. Ao excluir a nova matriz criada e brincando com as complicações, eu criei uma solução funcional:

 < !DOCTYPE html>   

Função autônoma recursiva que pode retornar qualquer número de itens (idêntico ao lodash.sampleSize ):

 function getRandomElementsFromArray(array, numberOfRandomElementsToExtract = 1) { const elements = []; function getRandomElement(arr) { if (elements.length < numberOfRandomElementsToExtract) { const index = Math.floor(Math.random() * arr.length) const element = arr.splice(index, 1)[0]; elements.push(element) return getRandomElement(arr) } else { return elements } } return getRandomElement([...array]) } 
 static generateMonth() { const theDate = ['January', 'February', 'March']; const randomNumber = Math.floor(Math.random()*3); return theDate[randomNumber]; }; 

Na minha opinião, melhor do que brincar com protótipos, ou declarar isso na hora certa, eu prefiro expor isso à janela:

 window.choice = function() { if (!this.length || this.length == 0) return; if (this.length == 1) return this[0]; return this[Math.floor(Math.random()*this.length)]; } 

Agora, em qualquer lugar no seu aplicativo, você chama assim:

 var rand = window.choice.call(array) 

Desta forma, você ainda pode usar for(x in array) loop for(x in array) corretamente

Usando o Faker.js :

 const Faker = require('faker'); Faker.random.arrayElement(['January', 'February', 'March']); 

Este trabalho é como um encanto para mim sem qualquer repetição.

  var Random_Value = Pick_Random_Value(Array); 

 function Pick_Random_Value(IN_Array) { if(IN_Array != undefined && IN_Array.length > 0) { var Copy_IN_Array = JSON.parse(JSON.stringify(IN_Array)); if((typeof window.Last_Pick_Random_Index !== 'undefined') && (window.Last_Pick_Random_Index !== false)) { if(Copy_IN_Array[Last_Pick_Random_Index] != undefined) { Copy_IN_Array.splice(Last_Pick_Random_Index,1); } } var Return_Value = false; if(Copy_IN_Array.length > 0) { var Random_Key = Math.floor(Math.random() * Copy_IN_Array.length); Return_Value = Copy_IN_Array[Random_Key]; } else { Return_Value = IN_Array[Last_Pick_Random_Index]; } window.Last_Pick_Random_Index = IN_Array.indexOf(Return_Value); if(window.Last_Pick_Random_Index === -1) { for (var i = 0; i < IN_Array.length; i++) { if (JSON.stringify(IN_Array[i]) === JSON.stringify(Return_Value)) { window.Last_Pick_Random_Index = i; break; } } } return Return_Value; } else { return false; } } 
 var items = Array("elm1","elm2","elm3","elm4",...); var item = items[Math.floor(Math.random()*items.length)]; 

Aqui está um exemplo de como fazer isso:

 $scope.ctx.skills = data.result.skills; $scope.praiseTextArray = [ "Hooray", "You\'re ready to move to a new skill", "Yahoo! You completed a problem", "You\'re doing great", "You succeeded", "That was a brave effort trying new problems", "Your brain was working hard", "All your hard work is paying off", "Very nice job!, Let\'s see what you can do next", "Well done", "That was excellent work", "Awesome job", "You must feel good about doing such a great job", "Right on", "Great thinking", "Wonderful work", "You were right on top of that one", "Beautiful job", "Way to go", "Sensational effort" ]; $scope.praiseTextWord = $scope.praiseTextArray[Math.floor(Math.random()*$scope.praiseTextArray.length)]; 

Crie um valor random e passe para o array

Por favor, tente seguir o código ..

 //For Search textbox random value var myPlaceHolderArray = ['Hotels in New York...', 'Hotels in San Francisco...', 'Hotels Near Disney World...', 'Hotels in Atlanta...']; var rand = Math.floor(Math.random() * myPlaceHolderArray.length); var Placeholdervalue = myPlaceHolderArray[rand]; alert(Placeholdervalue);