Pesquisa de site

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

  1. Preencha um array com os números de 1 a 100.
  2. Embaralhe.
  3. 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 ;)

Artigos relacionados