¿Alguien puede ayudarme? Estoy tratando de hacer un juego de javascript simple que permita al usuario elegir un elemento aleatorio de acuerdo con su peso. El problema es que es difícil para mí obtener el elemento de menor peso en la matriz, así que me doy cuenta de que por qué no hacer un número máximo de selecciones y luego de alcanzar el número máximo, tendrá la garantía de obtener el elemento de menor peso. (Lo siento mucho por mi inglés, ya que no es mi primer idioma). También soy un principiante en javascript. >///<
Aquí está el código:
var firstPrize = [ "200k Yen Cash", "High End Computer Set" ]; //first prize with 0.5% chance of getting picked var secondPrize = [ "Xbox", "PS5", "Nintendo Switch" ]; //second prize with 25.3% chance of getting picked var thirdPrize = [ "10k Yen Cash", "10k Yen Amazon Voucher", "Airpods", "Customized Keyboard", "1-Yr Nitro Boost", "Shoes" ]; //third prize with 74.2% chance of getting picked var randFirstPrize = firstPrize[Math.floor(Math.random() * firstPrize.length)]; // random pick var randSecondPrize = secondPrize[Math.floor(Math.random() * secondPrize.length)]; // random pick var randThirdPrize = thirdPrize[Math.floor(Math.random() * thirdPrize.length)]; // random pick const prizes = [ randFirstPrize, randSecondPrize, randThirdPrize ]; // prizes as variables const weights = [ 0.5, 25.3, 74.2 ]; //prize percent chance function userPrize(prizes, weights) { var i; for (i = 0; i < weights.length; i++) weights[i] += weights[i - 1] || 0; var random = Math.random() * weights[weights.length - 1]; for (i = 0; i < weights.length; i++) if (weights[i] > random) break; return prizes[i]; }; //pick random weighted elements console.log(userPrize(prizes, weights)); El resultado esperado será principalmente un thirdPrize , ya que el peso es más alto que los otros premios. Entonces, mi objetivo es que, cuando un jugador alcance 150 selecciones/acumulación, tendrá la garantía de elegir firstPrize . Espero haber explicado bien mi pregunta.
Supongo que el código que publicaste actualmente funciona según lo previsto y deseas agregar la función de que "cuando un jugador alcance 150 selecciones/acumulación, se le garantizará que elija randFirstPrize".
Para hacer eso, necesitará una variable para realizar un seguimiento de cuántas veces eligieron:
let pickTimes = 0;Y debe agregarlo cada vez que un usuario elija:
// ... pickTimes++; return prizes[i]; Ahora, obviamente puedes revisar la variable pickTimes cada vez que elijas un premio aleatorio. Depende de usted cómo procesarlo, pero esta es una sugerencia:
var random = Math.random() * weights[weights.length - 1]; if (pickTimes == 150) { random = 100; // So your weight for first prize always meets the first prize condition pickTimes = 0; // You may want to reset the pick times so 150 times later users can still get guaranteed first prize. }Ps después de una lectura más completa, no entiendo su código de selección de peso. Puede que me equivoque, pero debe comprender el principio de cómo aplicarlo a partir de la lógica que expliqué anteriormente después de corregir su código si hay un problema.