jueves, 24 de octubre de 2013

ALEATORIO y RND en intervalos discontinuos.

Pocos días a trás un lector me planteó esta cuestión relacionada con la manera de generar un número aleatorio que estuviera entre los valores de dos intervalos discontinuos:

...¿Se podran generar numeros aleatorios en una celda con diferente intervalos?
Es decir, por ejemplo, generar un numero aleatorio entre el 1 y el 10 pero a la vez entre el 30 y 40...


Me interesó la cuestión por las consecuencias que arrastra emplear estras funciones 'aleatorias' en Excel, y es que no siempre lo generado es al 100% un valor aleatorio puro.

Para responder la pregunta planteada, lo primero que pensé fue en emplear la función ALEATORIO.ENTRE que nos devuelve un número entero aleatorio entre los números que especifique (recordemos que nuestro aleatorio cambia cada vez que se calcula la hoja de cálculo). Pero con esto sólo tenía cubierto el primer intervalo. Y el segundo?, como conseguiría de una 'manera aleatoria' llegar a valores del segundo intervalo?.
La idea surgió rapidamente, empleando la otra función ALEATORIO que nos ofrece un número real aleatorio mayor o igual a 0 y menor que 1, distribuido uniformemente.
Mi fórmula quedó entonces:
=SI(ALEATORIO()< 0,5;ALEATORIO.ENTRE(1;10);ALEATORIO.ENTRE(30;40))

La idea es clara, obtengo un aleatorio entre 0 y 1, si está por debajo de su mitad aplico un aleatorio del intervalo primero 1-10, en caso contrario del segundo intevalo 30-40.

O como panteó después el mismo lector:
=SI(Y(ALEATORIO.ENTRE(1;40)>11;ALEATORIO.ENTRE(1;40)<=19);ALEATORIO.ENTRE(1;10);ALEATORIO.ENTRE(30;40)) siguiendo la misma idea. En ambos casos tenía lo que quería, un valor cambiante entre 1 y 10 o 30 y 40.


La pregunta realmente es ¿es esto realmente un número al azar?, o ¿está condicionado a algo?. La duda se me planteó al recordar la función de VBA RND, puesto que ésta devuelve valores condicionados a los últimos valores. Podemos leer la documentación de Excel al respecto (que replico a continuación):
Comentarios:
La función Rnd devuelve un valor menor que 1 pero mayor o igual que cero.

El valor de número determina cómo la función Rnd genera un número aleatorio:

Para cualquier valor de semilla inicial se genera la misma secuencia de números. Esto es debido a que cada llamada sucesiva a la función Rnd usará el número anterior como valor de semilla para el siguiente número de la secuencia.

Antes de llamar a la función Rnd, utilice la instrucción Randomize sin argumento para inicializar el generador de números aleatorios con un valor de semilla basado en el reloj del sistema.

Nota: Para repetir secuencias de números aleatorios, llame a la función Rnd con un argumento negativo antes de utilizar la función Randomize con un argumento numérico. Al utilizar la instrucción Randomize con el mismo valor de número no se repite la secuencia anterior.


A saber, la clave está en esa definición de valor semilla:= Valor inicial usado para generar números pseudoaleatorios.
Pero también, al menos en VBA, en la instrucción Randomize que limpia la memoria y genera un número semilla nuevo que usa la función Rnd para crear secuencias de números pseudoaleatorios únicas.


¿Querrá decir esto entonces que en nuestra hoja de cálculo corremos el riesgo de obtener valores 'aleatorios' supeditados a algún valor semilla??, ¿existe en la hoja de cálculo alguna manera de liberar ese valor semilla, como hace Randomize en VBA??...
Hablemos entonces de valores pseudo-aleatorios, ya que por lo que parece, yo no he sido capaz de encontrar una respuesta a mis preguntas, la función ALEATORIO y ALEATORIO.ENTRE siguen algún tipo de algoritmo determinista para la producción de una serie de números, eso sí, que tienen muchas de las mismas propiedades de una serie de números aleatorios puros. Las secuencias pueden reflejar verdaderos números aleatorios en la distribución de frecuencias y la ausencia de patrones fácilmente discernibles; sin embargo, a diferencia de una secuencia pura, una secuencia pseudo-aleatoria es 100% predecible cuando se conocen su algoritmo y de las semillas (claro...).


Probablemente todo esto nos de igual, si lo que queremso es jugar un poco al azar, ya que mientras no concozcamos el algoritmo de Excel para estas funciones, nos valdrá el valor devuelto.. por que, para todos algo desconocido lo tomamos por suerte...

Si realmente queremos un número aleatorio lo más puro posible (pseudo-aleatorio en el mejor de los casos), al menos no condicionado a una semilla anterior, nos conformaremos con la función VBA RND junto a Randomize.


Por supuesto, cualquier informción al respecto de esta entrada, que aporte claridad al asunto, será muy bien recibida.

No hay comentarios:

Publicar un comentario en la entrada