Por ejemplo definimos una serie de funciones
function a() { return 0; }
function b() { return 1; }
function c() { return 2; }
var probas = [ 20, 70, 10 ]; // 20%, 70% and 10%
var funcs = [ a, b, c ]; // the functions array
Esa función genérica funciona para cualquier número de funciones, lo ejecuta y devuelve el resultado:
function randexec()
{
var ar = [];
var i,sum = 0;
// that following initialization loop could be done only once above that
// randexec() function, we let it here for clarity
for (i=0 ; i<probas.length-1 ; i++) // notice the '-1'
{
sum += (probas[i]/100.0);
ar[i] = sum;
}
// Then we get a random number and finds where it sits inside the probabilities
// defined earlier
var r = Math.random(); // returns [0,1]
for (i=0 ; i<ar.length && r>=ar[i] ; i++) ;
// Finally execute the function and return its result
return (funcs[i])();
}
Por ejemplo, vamos a tratar con nuestras 3 funciones, 100000 intentos:
var count = [ 0, 0, 0 ];
for (var i=0 ; i<100000 ; i++)
{
count[randexec()]++;
}
var s = '';
var f = [ "a", "b", "c" ];
for (var i=0 ; i<3 ; i++)
s += (s ? ', ':'') + f[i] + ' = ' + count[i];
alert(s);
El resultado en mi Firefox
a = 20039, b = 70055, c = 9906
Así una carrera alrededor del 20%, b ~ 70% y c ~ 10%.
Editar siguiente comentarios.
Si su navegador tiene una tos con return (funcs[i])();
, basta con sustituir la matriz funcs
var funcs = [ a, b, c ]; // the old functions array
con esta nueva (cuerdas)
var funcs = [ "a", "b", "c" ]; // the new functions array
vuelva a colocar la línea final de la función randexec()
return (funcs[i])(); // old
con esa nueva
return eval(funcs[i]+'()');
estas probabilidades son establecidos? como en, ¿vas a tener una tabla de probabilidades que se vinculen a funciones? o son dinámicos, basados en la entrada? –
Se establece la probabilidad, con la tabla que vincula a la función. – jen