Ver Mensaje Individual
  #3 (permalink)  
Antiguo 05/11/2009, 19:51
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años
Puntos: 260
Sonrisa Respuesta: Bajar probavilidad de aparicion

Hola,

Cita:
Iniciado por lair Ver Mensaje
... 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 original
  1. function mostrarProbabilidadRandom() {
  2.     var a = new Array(0, 0, 0, 0, 0, 0);
  3.     for (var i = 0; i < 2000000; i++) {
  4.         a[Math.floor(Math.random() * 6)]++;
  5.     }
  6.     for (var i = 0; i < a.length; i++) {
  7.         document.write("Aciertos para " + i + " : " + a[i] + "<br>");
  8.     }
  9. }
  10. 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 original
  1. var totalWeight = 0;
  2. var weights = new Array(10, 20, 30, 90, 10, 60);
  3. for (var i = 0; i < weights.length; totalWeight += weights[i++]);
  4.  
  5. function normalize(n) {
  6.     for (var i = 0, s = 0; i < weights.length; i++) {
  7.         s += weights[i]; if (s >= n) return i;
  8.     }
  9. }
  10. function verImagen() {
  11.     var i = Math.floor(Math.random() * totalWeight);
  12.     return normalize(i);
  13. }

Para probar la prioridad:

Código Javascript:
Ver original
  1. function mostrarProbabilidadPeso() {
  2.     var a = new Array(0, 0, 0, 0, 0, 0);
  3.     for (var i = 0; i < 2000000; i++) {
  4.         a[verImagen()]++;
  5.     }
  6.     for (var i = 0; i < a.length; i++) {
  7.         document.write("Aciertos para " + i + " con peso : " + weights[i] + " : " + (a[i] / 10000) + "<br>");
  8.     }
  9. }
  10. 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,