Hola,
Cita:
Iniciado por lair ... si defines un intervalo de 0 a 10 es muy poco probable o incluso nulo que el 0 y el 10 aparescan, ...
Ha de ser el peor algoritmo 'random' que haya escuchado. La probabilidad que salga un número de 0 a 10, deber ser aproximadamente uniforme en el rango.
Por ejemplo:
Código Javascript
:
Ver originalfunction mostrarProbabilidadRandom() {
var a = new Array(0, 0, 0, 0, 0, 0);
for (var i = 0; i < 2000000; i++) {
a[Math.floor(Math.random() * 6)]++;
}
for (var i = 0; i < a.length; i++) {
document.write("Aciertos para " + i + " : " + a[i] + "<br>");
}
}
mostrarProbabilidadRandom();
La salida debería ser aproximadamente así:
Código:
Aciertos para 0 : 334101
Aciertos para 1 : 333162
Aciertos para 2 : 333366
Aciertos para 3 : 333140
Aciertos para 4 : 333491
Aciertos para 5 : 332740
Una posible implementación para extraer un valor por peso, donde cada indice tiene un valor diferente que le da mayor prioridad,
Código Javascript
:
Ver originalvar totalWeight = 0;
var weights = new Array(10, 20, 30, 90, 10, 60);
for (var i = 0; i < weights.length; totalWeight += weights[i++]);
function normalize(n) {
for (var i = 0, s = 0; i < weights.length; i++) {
s += weights[i]; if (s >= n) return i;
}
}
function verImagen() {
var i = Math.floor(Math.random() * totalWeight);
return normalize(i);
}
Para probar la prioridad:
Código Javascript
:
Ver originalfunction mostrarProbabilidadPeso() {
var a = new Array(0, 0, 0, 0, 0, 0);
for (var i = 0; i < 2000000; i++) {
a[verImagen()]++;
}
for (var i = 0; i < a.length; i++) {
document.write("Aciertos para " + i + " con peso : " + weights[i] + " : " + (a[i] / 10000) + "<br>");
}
}
mostrarProbabilidadPeso();
Y debería mostrar algo parecido a esto:
Código:
Aciertos para 0 con peso : 10 : 9.968
Aciertos para 1 con peso : 20 : 18.1748
Aciertos para 2 con peso : 30 : 27.3048
Aciertos para 3 con peso : 90 : 81.8599
Aciertos para 4 con peso : 10 : 9.0759
Aciertos para 5 con peso : 60 : 53.6166
Es decir, la probabilidad que saliera un número se generó en base al total de la suma de los pesos de cada índice, y después se normalizó al índice respectivo. (También se puede realizar logarítmicamente pero en ese caso va a ser exponencial y los primeros valores van a tener menos peso que los últimos).
Saludos,