es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo agregar el peso de un artículo para la aleatorización.

¡Estoy aprendiendo a programar en Javascript y actualmente estoy probando esto! Tengo un objeto llamado ‘jugador’ con recompensas de cofre. En el cofre, hay algunos objetos que se dan al azar. ¿Cómo puedo agregar peso a los diferentes objetos en el arreglo para que el objeto ‘oro’ no se dé tan frecuentemente (objeto raro)? También estoy confundido con la salida, está imprimiendo ‘undefined’, pero no entiendo de dónde proviene.

const lootBoxA = ['oro', 'plata', 'camisa', 'pantalones'];

const jugador = {

  recompensaCofre: lootBoxA,

    recompensaActual(){

      while (this.recompensaActual){
        this.recompensaActual = this.recompensaCofre[Math.floor(Math.random() * 4)];
        console.log(this.recompensaActual);

      if (this.recompensaActual === 'oro'){
        console.log('¡Bonus!');
      }break;
    }
  }
}
console.log(jugador.recompensaActual()); 
/*Salida
oro
¡Bonus!
undefined*/
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar peso a diferentes elementos en el arreglo, puedes crear un nuevo arreglo de objetos que contenga los elementos y sus respectivos pesos. Por ejemplo:

    const lootBoxA = [
      {item: 'gold', weight: 0.2},
      {item: 'silver', weight: 0.3},
      {item: 'shirt', weight: 0.4},
      {item: 'shorts', weight: 0.1}
    ];
    

    Aquí, el oro tiene un peso de 0.2, lo que significa que hay un 20% de probabilidad de que sea seleccionado. Para seleccionar un elemento al azar basado en su peso, puedes recorrer el arreglo y generar un número aleatorio entre 0 y 1. Luego, puedes ir sumando los pesos hasta encontrar el elemento cuyo peso acumulativo exceda el número aleatorio.

    En cuanto a la salida indefinida, se debe a que el método currentReward no tiene una declaración de retorno. Por lo tanto, cuando llamas a console.log(player.currentReward()), muestra el valor devuelto por el método, el cual es indefinido. Para solucionar esto, puedes agregar una declaración de retorno al final del método currentReward:

    currentReward(){
      while (this.currentReward){
        this.currentReward = this.chestReward[Math.floor(Math.random() * 4)];
        console.log(this.currentReward);
    
        if (this.currentReward === 'gold'){
          console.log('¡Bono!');
          break;
        }
      }
      return this.currentReward;
    }
    

    Ahora, al llamar console.log(player.currentReward()) mostrará el elemento seleccionado aleatoriamente, sin el valor indefinido al final.

Comments are closed.