• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

187
Views
generar 2 números aleatorios diferentes de una matriz?

mi único problema hasta ahora es que cuando los barcos tienen el mismo valor, recibo un mensaje de error si estoy usando VSC. TypeError: Asignación a variable constante. Estaba tratando de llegar a diferentes valores usando la condición, pero creo que no funciona.

 let grid = [[]]; const letters = "abc".toUpperCase(); // create the Grid const createGrid = (size) => { let row; let col = 0; for (row = 0; row < size; row++) { grid[row] = []; for (col = 0; col < size; col++) { grid[row][col] = `${letters[row]}${col + 1}`; } } }; createGrid(letters.length); console.table(grid); // Start the game //create ships const flatArray = grid.reduce((acc, curr) => { return [...acc, ...curr]; }, []); function getRandomNumber(len) { return Math.floor(Math.random() * len); } const randomNumber1 = getRandomNumber(flatArray.length); const randomNumber2 = getRandomNumber(flatArray.length); while(randomNumber1 == randomNumber2) { getRandomNumber(); } var shipOne = flatArray[randomNumber1]; var shipTwo = flatArray[randomNumber2]; console.log(shipOne); console.log(shipTwo);

about 3 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Arreglar un bucle infinito

Creé un fragmento de su código de ejemplo y se ejecuta para siempre en el caso de error que está describiendo.

Un problema es que tienes un bucle while que se ejecutará para siempre:

 while(randomNumber1 == randomNumber2) { getRandomNumber(); }

Ejecuta este código siempre que randomNumber1 y randomNumber2 sean iguales, pero no actualiza ninguno de ellos en el ciclo para que nunca sea falso.

Prueba esto:

 while(randomNumber1 == randomNumber2) { randomNumber2 = getRandomNumber(flatArray.length); }

También puede hacer que su código sea un poco más inteligente y eliminar elementos de la matriz flatArray que ya ha elegido.

about 3 years ago · Juan Pablo Isaza Report

0

Dentro de tu ciclo while, si los dos números aleatorios fueran iguales, estarías atrapado dentro de un ciclo infinito. Como dijo Pedro.

Para solucionar esto, use el código que Peter indicó, pero no olvide que aún necesita pasar la longitud de la matriz a esta función. De lo contrario, tendrá un error:

 while(randomNumber1 == randomNumber2) { randomNumber2 = getRandomNumber(flatArray.length); }

¡¡Gracias!!

about 3 years ago · Juan Pablo Isaza Report

0

Otro enfoque que podría intentar es crear una función pickRandomEntries() que seleccionará N entradas aleatorias de una matriz, sin seleccionar nunca las mismas.

Para hacer esto, barajamos una copia de tu flatArray() , luego elegimos los dos primeros elementos.

De esta forma nunca tendremos que comprobar si los barcos tienen el mismo valor:

 let grid = [[]]; const letters = "abc".toUpperCase(); const createGrid = (size) => { let row; let col = 0; for (row = 0; row < size; row++) { grid[row] = []; for (col = 0; col < size; col++) { grid[row][col] = `${letters[row]}${col + 1}`; } } }; createGrid(letters.length); const flatArray = grid.reduce((acc, curr) => { return [...acc, ...curr]; }, []); // Shuffle an array into a random order (using Fisher-Yates) function shuffle(arr) { for(let i = arr.length - 1; i > 0; i--) { let index = Math.floor(Math.random() * (i + 1)); [arr[index], arr[i]] = [arr[i], arr[index]]; } return arr; } // Pick count random items from the array function pickRandomEntries(arr, count) { let shuffled = shuffle([...arr]); return shuffled.slice(0, count); } let [shipOne, shipTwo] = pickRandomEntries(flatArray, 2); console.log( { shipOne, shipTwo });

about 3 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error