Codificación aprenderaprogramar.com: CU00315A
* Construcción preliminar de programas, en los que a falta de datos definitivos introducimos datos aleatorios. |
* Simular procesos aleatorios (número resultante de tirar un dado, elección de un color por parte de una persona, número premiado en un sorteo de lotería, cantidad de personas que entran a un supermercado en una hora...) |
|
* Verificación de programas, y en particular simular datos que le llegan al programa como si fueran datos provinientes de entradas de usuario, de una base de datos, de un fichero, etc. | |
* Otras aplicaciones. |
Conviene recordar que "aleatorio" no puede confundirse con "cualquier cosa", "descontrol", "incierto", "impredecible", etc. Usaremos aleatorio más en el sentido de no predeterminado que en el de no predecible, ya que en general vamos a definir qué tipo de resultado queremos obtener y en qué rango de valores debe estar. Vamos a imaginar que Visual Basic genera números aleatorios como si fuera un robot lanzador de dardos muy preciso (robot Rnd). De este modo, cuando se le dice que comience a tirar dardos en distintas posiciones, repite siempre los lugares. Por ejemplo, si la diana está marcada con números, cada vez que le decimos que tire genera la misma secuencia: 7, 5, 6, 3, etc. ¿Cómo conseguir convertir este proceso predefinido en aleatorio? Pues simplemente poniendo a girar la diana (mayordomo Randomize) esta vez a una velocidad que depende del segundo del día en que nos encontremos. Así pues, el proceso lo dividimos en decirle al mayordomo que ponga a girar la diana y en decirle al robot que dispare. Bueno, un poco simple, pero ¿para qué complicarnos? Veamos la sintaxis a emplear:
1) Asignación de valor aleatorio a una variable
Randomize [Instrucción que inicializa el generador de números aleatorios]
Variable = Rnd [Obtención de un número aleatorio igual o mayor que cero y menor que uno]
En las versiones más recientes de Visual Basic la sintaxis es Randomize(): Variable = Rnd()
2) Mostrar un valor aleatorio.
Randomize: MsgBox (“El número aleatorio es “ & Rnd) para las versiones menos recientes
Randomize() : MsgBox("El número aleatorio es " & Rnd()) para las versiones más recientes
El valor devuelto por Rnd es de tipo Single, aunque si la variable a la que se asigna el contenido de Rnd es de otro tipo, tendrá lugar la conversión del valor originario para adaptarlo al tipo de variable de que se trate. Un aspecto importante a tener en cuenta es que el valor devuelto se encuentra en el rango 0<= Rnd < 1. Es decir, el número devuelto puede ser cero pero no puede ser uno. Podemos trasladarnos a un intervalo distinto simplemente multiplicando. Por ejemplo Rnd * 100 ó Rnd() * 100 devolverá números comprendidos entre cero y cien excluido el cien. Si usamos CInt(Rnd * 100) ó CInt(Rnd() * 100) estaremos convirtiendo el tipo Single que nos devuelve el Rnd en un tipo Integer, con lo que obtenemos valores enteros comprendidos entre 0 y 99.
Un caso muy habitual será el de querer generar números aleatorios comprendidos en un intervalo delimitado por un límite superior y un límite inferior siendo estos límites valores positivos. Para ello podemos usar la fórmula:
N = (Limsup - Liminf) * Rnd + Liminf
|
Limsupy Liminf son los límites superior e inferior respectivamente (valores positivos) y N el número aleatorio generado. El primer sumando puede adquirir el valor comprendido entre cero y el intervalo diferencia, excluido éste. El segundo sumando determina que el valor debe estar necesariamente comprendido entre el límite inferior y el límite superior.
Consideremos ahora que queremos generar valores enteros comprendidos entre a y b incluidos ambos, siendo a y b valores positivos. La fórmula a emplear sería:
N = Int((b - a + 1) * Rnd + a)
|
En este caso, usamos un truncamiento para garantizar que el valor superior del intervalo se encuentre entre los posibles valores de N.
Una instrucción Randomize te puede servir para varios Rnd. De todas formas, cuando tengas dudas, pon un Randomize asociado a cada uno de los Rnd.
Recuerda que en algunas versiones se usa Randomize y Rnd sin paréntesis y en otras se usa Randomize() y Rnd() con paréntesis.