Saltar al contenido

Generando números aleatorios que no se repiten en JS

Poseemos la mejor información que descubrimos online. Esperamos que te resulte de mucha ayuda y si quieres aportar cualquier detalle que nos pueda ayudar a mejorar hazlo libremente.

Solución:

Si entiendo bien, ¿solo está buscando una permutación (es decir, los números aleatorios sin repeticiones) de los números 1-10? ¿Tal vez intente generar una lista aleatoria de esos números, una vez, al principio, y luego simplemente trabaje con ellos?

Esto calculará una permutación aleatoria de los números en nums:

var nums = [1,2,3,4,5,6,7,8,9,10],
    ranNums = [],
    i = nums.length,
    j = 0;

while (i--) 
    j = Math.floor(Math.random() * (i+1));
    ranNums.push(nums[j]);
    nums.splice(j,1);

Entonces, por ejemplo, si estaba buscando números aleatorios entre 1 y 20 que también fueran pares, entonces podría usar:

nums = [2,4,6,8,10,12,14,16,18,20];

Entonces solo lee ranNums para recordar los números aleatorios.

Esto no corre el riesgo de que tarde cada vez más en encontrar números no utilizados, como lo estaba encontrando en su enfoque.

EDITAR: Después de leer esto y realizar una prueba en jsperf, parece que una forma mucho mejor de hacerlo es Fisher-Yates Shuffle:

function shuffle(array) 
    var i = array.length,
        j = 0,
        temp;

    while (i--) 

        j = Math.floor(Math.random() * (i+1));

        // swap randomly chosen element with current element
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;

    

    return array;


var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);

Básicamente, es más eficiente al evitar el uso de ‘caro’ array operaciones.

EDICIÓN ADICIONAL: Otra posibilidad es usar generadores (suponiendo que tenga soporte):

function* shuffle(array) 

    var i = array.length;

    while (i--) 
        yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0];
    


Entonces para usar:

var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);

ranNums.next().value;    // first random number from array
ranNums.next().value;    // second random number from array
ranNums.next().value;    // etc.

donde ranNums.next().value eventualmente evaluará a undefined una vez que haya recorrido todos los elementos en el barajado array.

En general, esto no será tan eficiente como el Fisher-Yates Shuffle porque todavía estás splice-ing un array. Pero la diferencia es que ahora está haciendo ese trabajo solo cuando lo necesita en lugar de hacerlo todo por adelantado, por lo que, dependiendo de su caso de uso, esto podría ser mejor.

//random number without repetition in JavaScript, Just in one line;
//it can be used as _id;
//it not need to store or check;

const myRnId = () => parseInt(Date.now() * Math.random());

console.log(myRnId()); // any random number included timeStamp;

Esto hará lo que estás buscando:

let anArrayOfUniqueNumbers = [];

let numberGenerator = function(arr) 
  if (arr.length >= 10) return;
  let newNumber = Math.floor(Math.random() * 10 + 1);
  if (arr.indexOf(newNumber) < 0) 
    arr.push(newNumber);
  
  numberGenerator(arr);
;

numberGenerator(anArrayOfUniqueNumbers);

Tenemos:

  • un nuevo array
  • una función que toma un array como argumento

Esta función:

  • Compruebe si el array está operando ya tiene diez índices, y si no:
  • Generar un número aleatorio entre 1-10
  • Si ese número aleatorio no está en el array sin embargo, empújelo hacia el array
  • Corre de nuevo

Debido a la cláusula de guardia (if (arr.length >= 10) return;), la función dejará de ejecutarse una vez que se hayan cumplido los parámetros.

valoraciones y comentarios

Eres capaz de confirmar nuestro ensayo poniendo un comentario o dejando una valoración te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *