javascript - Gerar números aleatórios únicos entre 1 e 100
Como posso gerar alguns números aleatórios únicos entre 1 e 100 usando JavaScript?
Resposta #1
Por exemplo: Para gerar 8 números aleatórios únicos e armazená-los em um array, você pode simplesmente fazer assim:
var arr = [];
while(arr.length < 8){
var r = Math.floor(Math.random() * 100) + 1;
if(arr.indexOf(r) === -1) arr.push(r);
}
console.log(arr);Resposta #2
- Preencha um array com os números de 1 a 100.
- Embaralhe.
- Pegue os primeiros 8 elementos do array resultante.
Resposta #3
Solução moderna em JS usando Set (e caso médio O(n))
const nums = new Set();
while(nums.size !== 8) {
nums.add(Math.floor(Math.random() * 100) + 1);
}
console.log([...nums]);Resposta #4
Outra abordagem é gerar um array de 100 itens com números em ordem crescente e classificá-lo aleatoriamente. Isso leva, na verdade, a um trecho de código realmente curto e (na minha opinião) simples.
const numbers = Array(100).fill().map((_, index) => index + 1);
numbers.sort(() => Math.random() - 0.5);
console.log(numbers.slice(0, 8));Resposta #5
Gere permutação de 100 números e, em seguida, escolha serialmente.
Use o Algoritmo Knuth Shuffle (também conhecido como Fisher-Yates shuffle).
JavaScript:
function fisherYates ( myArray,stop_count ) {
var i = myArray.length;
if ( i == 0 ) return false;
int c = 0;
while ( --i ) {
var j = Math.floor( Math.random() * ( i + 1 ) );
var tempi = myArray[i];
var tempj = myArray[j];
myArray[i] = tempj;
myArray[j] = tempi;
// Edited thanks to Frerich Raabe
c++;
if(c == stop_count)return;
}
}
CÓDIGO COPIADO DO LINK.
EDITAR:
Código melhorado:
function fisherYates(myArray,nb_picks)
{
for (i = myArray.length-1; i > 1 ; i--)
{
var r = Math.floor(Math.random()*i);
var t = myArray[i];
myArray[i] = myArray[r];
myArray[r] = t;
}
return myArray.slice(0,nb_picks);
}
Problema potencial:
Suponha que temos um array de 100 números {por exemplo, [1,2,3...100]} e paramos de trocar após 8 trocas; então, na maioria das vezes, o array parecerá {1,2,3,76,5,6,7,8,... os números aqui estarão embaralhados ...10}.
Porque cada número será trocado com probabilidade de 1/100, então a probabilidade de trocar os primeiros 8 números é 8/100, enquanto a probabilidade de trocar os outros 92 é 92/100.
Mas se executarmos o algoritmo para o array completo, então temos certeza de que (quase) cada entrada é trocada.
Caso contrário, enfrentamos uma questão: quais 8 números escolher?
Resposta #6
As técnicas acima são boas se você quiser evitar uma biblioteca, mas dependendo se você estiver disposto a usar uma biblioteca, eu sugeriria dar uma olhada no Chance para gerar coisas aleatórias em JavaScript.
Especificamente para resolver sua pergunta, usar o Chance é tão fácil quanto:
// One line!
var uniques = chance.unique(chance.natural, 8, {min: 1, max: 100});
// Print it out to the document for this snippet so we can see it in action
document.write(JSON.stringify(uniques));<script src="http://chancejs.com/chance.min.js"></script>Aviso, como autor de Chance, sou um pouco parcial ;)
