¿Hay alguna manera de extraer un valor basado en un porcentaje?
Probabilidad de valor:
Malo: 1%
Normal: 29%
Bueno: 70%
var move ["bad","normal","good"];Una declaración condicional simple:
if (move == "bad") { bad_move = "That's a bad move!"; } else if (move == "normal") { normal_move = "Classic move!"; } else { good_move = "Amazing move!"; }Entonces, ¿PHP es mejor que Javascript para este tipo de problema?
Podrías escribir una función que muestree valores con porcentajes de probabilidad dados:
function weightedSample(pairs) { const n = Math.random() * 100; const match = pairs.find(({value, probability}) => n <= probability); return match ? match.value : last(pairs).value; } function last(array) { return array[array.length - 1]; } const result = weightedSample([ {value: 'Bad', probability: 1}, {value: 'Normal', probability: 29}, {value: 'Good', probability: 70} ]); console.log(result);No puedo decir si PHP sería mejor. Este tipo de problema no debería ser más/menos difícil en PHP. Lo que debe usar (JS o PHP) realmente depende de si la función debe ejecutarse o no en el servidor o el cliente.
Sugiero usar una verificación continua de la probabilidad y el resto del número aleatorio.
Esta función establece primero el valor devuelto al último índice posible e itera hasta que el resto del valor aleatorio es menor que la probabilidad real.
Las probabilidades tienen que sumar uno.
function getRandomIndexByProbability(probabilities) { var r = Math.random(), index = probabilities.length - 1; probabilities.some(function (probability, i) { if (r < probability) { index = i; return true; } r -= probability; }); return index; } var i, move = ["bad", "normal", "good"], probabilities = [0.01, 0.29, 0.7], count = {}, index; move.forEach(function (a) { count[a] = 0; }); for (i = 0; i < 1e6; i++) { index = getRandomIndexByProbability(probabilities); count[move[index]]++; } console.log(count); .as-console-wrapper { max-height: 100% !important; top: 0; }