sábado, 8 de septiembre de 2012

Distribución Uniforme

Puede descargar el archivo: uniforme.xlsm

En estadística disponemos de la distribución Uniforme. Es una distribución de carácter continuo que asigna la misma probabilidad en cualquier parte del intervalo en el que está definida.

ALEATORIO

En Excel se puede conseguir con la función:
=ALEATORIO()
que nos proporciona un número aleatorio entre 0 y 1, sin llegar al valor 1. Esto se expresa diciendo que la función genera números aleatorios en el intervalo [0;1).

En realidad, lo que se genera es un número pseudoaleatorio ya que se obtiene con ciertos algoritmos internos, y no sacando por ejemplo, bolas de un bombo de la lotería, o tirando monedas al aire a cara o cruz, lo cual generaría valores realmente aleatorios.

Podemos escribir la función ALEATORIO() en Excel y al pulsar luego la tecla de función F9, de recálculo manual, observaremos que el valor aleatorio que se obtiene cambia. Es un número entre 0 y 1 con muchos decimales. En la siguiente imagen se muestran diez números aleatorios obtenidos con esta función.


Los valores aleatorios también cambian siempre que se recalculen los valores de la hoja, cosa que sucede cada vez que se introduce un nuevo valor o se edita uno existente.

Ejemplo

Escriba en una celda un número aleatorio con la función ALEATORIO() y en otra celda escriba la palabra Hola. Al pulsar Enter observe como cambia el valor aleatorio ya que se recalcula toda la hoja.


Aleatorios en un intervalo


Vamos a ver las transformación que podemos realizar partiendo de un aleatorio creado con la función ALEATORIO(), al multiplicar por un número y al sumar cierta cantidad. También veremos cómo podemos quitar la parte fraccionaria y quedarnos únicamente con la parte entera.

Factor de escala


Si a la función ALEATORIO() la multiplicamos por un número la estamos afectando de un factor de escala. Por ejemplo, al multiplicar por 200, el número aleatorio que se obtiene ya no se mueve en el intervalo [0;1) sino en el intervalo [0;200).
=ALEATORIO()*200

Esto supone amplificar 200 veces el resultado obtenido con el número aleatorio.



Traslación


Si al número aleatorio anterior se le suma una cierta cifra lo que estamos haciendo es un cambio de escala. Por ejemplo, después de haber multiplicado por 200, lo que haremos es sumar 5.000 con lo que el número obtenido ya no se moverá en el intervalo [0;200) sino en el intervalo [5000;5200).
=5000+ALEATORIO()*200

Será un número con decimales como el del siguiente ejemplo.



Parte entera

Si deseamos quitar los decimales, podemos utilizar la función =ENTERO. Es una función que no redondea, lo que hace es truncar la parte fraccionaria y quedarse únicamente con la parte entera.

=ENTERO(5000+ALEATORIO()*200)




En este ejemplo, lo que conseguimos es un número entero en el intervalo [5000;5199]. No se llega a alcanzar nunca el valor 5200, ya que nunca se llegaba a alcanzar el valor 1 con la función ALEATORIO, y la función ENTERO lo que hace es quitar la parte decimal.

Si queremos llegar hasta 5.200 hemos de sumar 1.

=ENTERO(5000+ALEATORIO()*200)+1


En este caso el aleatorio obtenido será un número entero que se mueve en el intervalo [5001;5200]


ALEATORIO.ENTRE


Existe una función en Excel que pertenece a las complementarias y que se denomina

=ALEATORIO.ENTRE(mínimo;máximo)


Esta función genera números aleatorios enteros entre un valor mínimo y un valor máximo que proporcionemos.

Para conseguir el mismo intervalo que el que hemos creado en el apartado anterior escribiríamos la siguiente expresión.

=ALEATORIO.ENTRE(5001;5200)
>

En VBA


En programación tambíen podemos crear números aleatorios. En realidad son número pseudoaleatorios ya que se generan con algoritmos que imitan a los verdaderos números aleatorios.


La función que genera los números aleatorios es

Rnd


Genera un número aleatorio entre 0 y 1, excluido el 1. Es similar a la función ALEATORIO.

Barajar

Los números aleatorios que genera VBA en realidad no son aleatorios y se pueden repetir según una cierta secuencia. Para evitar que se repitan lo que hacemos es utilizar el comando

RANDOMIZE


que equivale a barajar las cartas de una baraja. Es lo que se denomina cambiar la semilla de generación de los números aleatorios.

RANDOMIZE lo utilizaremos en nuestro programa, normalmente una sola vez, al principio. Por ejemplo, después de los DIM. En caso de usar bucles se debe procurar no introducirlo dentro, ya que sino estaría barajando continuamente a cada iteración del bucle.


Método 1

El siguiente programa genera 10 números aleatorios y los escribe en la columna A.


Aleatorios en un intervalo

Si deseamos generar aleatorios en un cierto intervalo entre un valor mínimo (min) y un cierto valor máximo (max), sin decimales, utilizaremos la siguiente expresión:

Int((max - min + 1) * Rnd + min)
Por ejemplo, podemos utilizar la 'ventana Inmediato' para generar números aleatorios enteros entre 80 y 100.

Método 2

Para generar números aleatorios entre 5.000 y 5.200 utilizaremos la siguiente expresión.
Int((5200 - 5000 + 1) * Rnd + 5000)
En el siguiente programa generamos 10.000 números aleatorios entre 5.000 y 5.200.


Método 3

Otro sistema que me gusta emplear para conseguir lo anterior es el siguiente.


Se multiplica por 201 ya que realmente entre 5.000 y 5.200, incluidos ambos hay 201 números.


Consulte el siguiente post para ver cómo se trabaja con matrices y cómo se ahorra tiempo en los cálculos.


Listado de valores con Macro

Cuando se trabajan con muchos valores es aconsejable utilizar matrices.

Método 4

También podemos llamar a una función de Excel desde el código de VBA. Las funciones a las que llamemos  han de estar en inglés, y el separador de argumentos es la coma, ya que todo va en inglés.

Para ver un listado de funciones en inglés y en español consulte el siguiente post:

Glosario: Traducción de funciones


La función ALEATORIO.ENTRE en inglés es RandBetween.

También se pude utilizar así:



Método 5

Si lo que deseamos es dejar la fórmula en las celdas de la hoja en lugar de depositar el valor podemos utilizar la siguiente macro.



Método 6

Si lo que deseamos es utilizar nuestro idioma local depositando la fórmula en las celdas la macro será la siguiente.


Así podremos utilizar las fórmulas en español.

6 comentarios:

  1. muy bueno, indispensable si va a montar un modelo montecarlo.
    atte.
    francisco montecinos

    ResponderEliminar
  2. Hola Francisco.

    Esa es la idea: publicar una serie de entradas con las distribuciones de probabilidad más habituales y luego montar modelos de Montecarlo, aplicados a lo que se nos ocurra. Básicamente gestión empresarial y finanzas, aunque realmente se puede aplicar a cualquier cosa.

    Un cordial saludo.

    ResponderEliminar
  3. Master muy bueno ya tengo como hacer un rifa sin que me repitan los numeros. y realmente el ganador si es de pura suerte.

    ResponderEliminar
  4. Estimado Adolfo: podrías publicar otra explicación-ejemplo de la distribución TRIANGULAR usando Excel. vi un ejemplo en una planilla que tu publicaste, pero cuesta entenderla para mi. Agradecido, Francisco

    ResponderEliminar
  5. Hola Adolfo,
    Acabo de descubrir tu blog y me parece que seré asidua del mismo. Está muy bien.
    Yo he preparado una hoja de cálculo que me permite, simular un cif de una empresa, el problema que tengo es con el número aleatorio, que me cambia, he utilizado la función Aleatorio.entre(0;9999999), ya que tiene que tener 7 cifras. Lo que quiero es que no cambie y sin utilizar vba no sé como hacerlo.
    ¿Alguna sugerencia?
    Saludos,
    Ana

    ResponderEliminar
  6. Disculpa amigo, eh entendido bastante sobre como programar en VBA estos metodos, una pregunta, como podria meter cuantas cifras imprimir, por ejemplo si quisiera 5 cifras significativas en el primer metodo que es este:

    _________________________________
    Sub alea1()
    Dim i As Integer
    Randomize
    For i = 1 To 100
    Cells(i + 3, "B") = Rnd
    Next i
    End Sub
    _________________________________

    ResponderEliminar