Obtener un número aleatorio en JavaScript pero con probabilidad

publicado por: Anonymous

Tengo la siguiente duda, con JavaScript puedo obtener un número aleatorio de la siguiente forma:

function randomIntFromInterval(min,max) {
    return Math.floor(Math.random()*(max-min+1)+min);
}

Pero me gustaría meterle probabilidad a cada número, es decir, de un intervalo del 1 al 10 quiero que 5 tenga tanto porcentaje de que me aparezca, y lo mismo para otros números. Hasta ahora no encuentro cómo hacerlo.

solución

Una posible solución seria, ademas de indicar el rango, pasar a la función una matriz de números “especiales” y sus probabilidades (de 0 a 1).
Entonces, la función, para cada numero “especial” prueba si un numero aleatorio es menor a la probabilidad ( si es 1, siempre sera menor, si es .5 la mitad…) y de serlo, retorna el numero que corresponda.
En caso de no acertar ninguno, retorna un numero aleatorio normal.
En el siguiente ejemplo, busco 100 veces un numero aleatorio de 0 a 10, donde el 0 tiene un .2 y el 5 un .5 de probabilidades de aparecer, y muestro cuantas veces ha aparecido cada numero.

_x000D_

_x000D_

/*  Funcion aleatorioConProbabilidad_x000D_
      Parámetros de entrada:_x000D_
        min,max : Rango de números a elegir._x000D_
        matrizNumeros : Array con los números con una probabilidad propia._x000D_
        matrizProbabilidad : Array con la probabilidad (de 0 a 1) de cada_x000D_
          número de matrizNumeros._x000D_
*/_x000D_
function aleatorioConProbabilidad (min,max,matrizNumeros,matrizProbabilidad){_x000D_
	for (let i=0; i<matrizProbabilidad.length; i++)_x000D_
    /* Prueba números con probabilidad propia, si alguno sale lo retorna. */_x000D_
		if (Math.random()<matrizProbabilidad[i])_x000D_
			return matrizNumeros[i];_x000D_
  /*  Si no ha salido ningún número con probabilidad propia retorna un numero_x000D_
      aleatorio con probabilidad normal. */_x000D_
	return Math.floor(Math.random()*(max-min+1)+min);_x000D_
}_x000D_
/*  Prueba de la función: generaremos 100 números aleatorios de 0 a 10_x000D_
    y contaremos cuantas veces aparece cada número */_x000D_
_x000D_
/*  Para el contador usaremos una matriz donde en cada posición_x000D_
    contará las veces que ha salido el número que corresponda a_x000D_
    la propia posición (en la posición 0 cuenta las veces que aparece el 0,_x000D_
    en la posición 1 cuanta las veces que aparece el 1...etc)_x000D_
*/_x000D_
contador=[];_x000D_
_x000D_
/*  Como los números son del 0 al 10, la matriz tiene 11 posiciones.*/_x000D_
contador.length=11;_x000D_
_x000D_
/*  Inicializamos la matriz con 0's */_x000D_
contador.fill(0);_x000D_
_x000D_
/*  Ejecutamos la función 100 veces y incrementa la posición del contador_x000D_
    que corresponde al numero aparecido. */_x000D_
for (let i=0; i<100; i++)_x000D_
  /* Numero aleatorio de 0 a 10 donde el 0 tiene un .2 de salir y el 5 un .5 */_x000D_
  contador[aleatorioConProbabilidad(0,10,[0,5],[.2,.5])]++;_x000D_
_x000D_
/*Muestra el contador por consola */_x000D_
console.log("Veces que ha salido el numero que corresponde a la posicion del siguiente array:");_x000D_
console.log(contador.toString());

_x000D_

_x000D_

_x000D_

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *