Macro Aleatorio Entre para OpenOffice y LibreOffice Basic
OOoBasic, AOOBasic y LibOBasic son casi iguales. Probablemente y poco a poco estos tres productos irán divergiendo, pero de momento los tres carecen de una función que nos ofrezca un número aleatorio entre un rango de valores.
Sí que disponen de la función Rnd(), que nos permite obtener un número aleatorio entre 0 y 1.
Nos hemos inspirado en la hoja de cálculo Calc, que posee una función llamada Aleatorio.Entre que nos devuelve un número entero entre dos valores, uno inferior y otro mayor.
A continuación detallamos una función que podemos implementar en nuestra librería de funciones básicas y que realizará el mismo trabajo para nuestras macros en Basic.
Hemos evaluado la situación y finalmente nos hemos decidido por una función que fácilmente nos permita obtener un valor aleatorio entre dos límites, entero o decimal a voluntad. Por su forma de operar, no permite obtener números cuando sus límites sean menores que la unidad o con decimales, pero con un sencillo truco (que vemos al final) se resuelve elegantemente.
La función que hemos implementado es la siguiente:
Function AleatorioEntre( nDesde As Long, nHasta As Long, Optional nDecimales As Integer ) As Single
'--------------------------------------------------------------------------------------------
' Devuelve un valor aleatorio con nDecimales entre nDesde y nHasta. Para valores enteros, omitir nDecimales
If IsMissing( nDecimales ) Then nDecimales = 0 Else nDecimales = Abs( nDecimales )
nDesde = nDesde * 10^nDecimales : nHasta = nHasta * 10^nDecimales
AleatorioEntre = Int( ( nHasta - nDesde + 1 ) * Rnd() + nDesde ) / 10^nDecimales
End Function
La función devuelve valores correctos incluso si por error pasamos un número mayor para el límite inferior que para el límite superior.
Admite como límites valores positivos y negativos.
Para obtener valores enteros, omitimos el argumento nDecimales. Si lo utilizamos, obtendremos números aleatorios entre dos valores con decimales.
Valores límites menores que la unidad
Para valores límites menores que la unidad, se puede utilizar el siguiente truco, que consiste en multiplicar los límites por 10^número de decimales que buscamos, y dividir el resultado también por 10^número de decimales:
Ejemplo de valores aleatorios entre 0 y 1 con tres decimales
x = AleatorioEntre( 0, 1000 ) / 1000
Ejemplo de valores aleatorios entre -1 y 1 con seis decimales
x = AleatorioEntre( -1000000, 1000000 ) / 1000000
Ejemplo de valores aleatorios entre -0,001 y 0,001 con seis decimales
x = AleatorioEntre( -1000, 1000 ) / 1000000
Valores límites con decimales
Para valores límites con decimales, se puede utilizar el siguiente truco, idéntico al anterior, que consiste en multiplicar los límites por 10^número de decimales mayor que tienen los números que definen los límites, y dividir el resultado también por 10^número de decimales::
Ejemplo de valores aleatorios entre -1,5 y 1,5
x = AleatorioEntre( -15, 15 ) / 10
Ejemplo de valores aleatorios entre 100,25 y 300,75
x = AleatorioEntre( 10025, 30075 ) / 100