Pues eso… aquí te explicaré cómo generar números aleatorios con decimales y cómo indicar los valores entre los que quieres que estén esos números usando la clase Random de .NET y con ejemplos tanto para Visual Basic .NET como para C# (e incluso para BASIC, bueno… al menos para Visual Basic 6.0 y anteriores).
Pero primero te contaré la «batallita del Guille» para que sepas el porqué a estas alturas de la vida te explico algo tan «elemental»
Si no te quieres leer la batallita, pues… pasa un poco más abajo que ahí te muestro el código de ejemplo tanto para Visual Basic .NET como para C# e incluso para VB6.
La batallita del Guille
Estaba yo el otro día escribiendo un código en el que necesitaba generar dos números aleatorios (en realidad varios).
Dos de ellos eran números enteros, en esos no tuve mayor problema, ya que tenía este artículo publicado en mi sitio: Random.Next ese incomprendido y me lo leí, y todo a la perfección…
El problema me surgió al crear los números aleatorios con decimales.
Yo sabía que usando NextDouble de la clase Random era como tenía que hacerlo (la certeza era porque yo lo decía al final del artículo ese que te he comentado en el párrafo anterior ).
Y curiosamente en ese mismo comentario decía que lo más parecido a la función Rnd() de Visual Basic 6.0 era precisamente NextDouble.
Pero… ¿quieres creerte que ya no me acordaba cómo se usaba la función RND de BASIC? jajajaja, en fin… seguramente serán cosas de la edad o de que en los últimos años no tengo la programación como una de mis tareas diarias… en fin…
La cuestión es que volvía a buscar en la web (indicando elGuille) cómo usar RND o casi… y me encontré como mi Curso Básico de Programación en Visual Basic, concretamente en las soluciones de la décima entrega, lo explicaba… ¡menos mal que el Guille aún mantiene su sitio después de los 22 años que cumplió hace pocos días!
Generar un número aleatorio con decimales entre dos cifras
El método NextDouble genera un número que será igual o mayor que 0.0 y menor (pero no igual) que 1.0.
Por tanto si lo multiplicaras, por ejemplo por 6, generaría un valor que iría desde 0.0 a 5.99.
Nota:
En Visual Basic 6.0 (o incluso en VB.NET y si me apuras hasta en C#) se utilizará la función Rnd para hacer el mismo papel que NextDouble, pero con valores de tipo Single en lugar de Double.
Tal como explico en las respuestas del curso básico, si quieres un número entero entre 20 y 50 debes escribir un código como este (este ejemplo es de VB6, las variables están declaradas en otra parte… supongo)
T = Int(Rnd * 31) + 20 ‘Número de rascadas, T valdrá de 20 a 50
Es decir la función Rnd (o el método NextDouble) debes multiplicarlo por 31 (50-20+1) y después añadirle el mínimo (20). De esa forma se genera el rango de valores que queremos usar.
En ese ejemplo se usa la función Int para convertir el resultado en un número entero, pero recuerda que ¡es código de VB6!
Ahora veremos ese mismo ejemplo pero haciendo las cosas bien y con .NET.
El código de ejemplo
El siguiente código creará un número aleatorio (con decimales) entre 20 y 50 (ambos incluidos).
Inserta este código en el método Main de una aplicación de consola.
Código para Visual Basic .NET
Dim r As New Random()
Dim minimo As Integer = 20
Dim maximo As Integer = 50
Dim res = (r.NextDouble() * (maximo - minimo + 1)) + minimo
Console.WriteLine("Un número Double entre {0} y {1} (incluidos)", minimo, maximo)
Console.WriteLine("(r.NextDouble * ({0} - {1} + 1)) + {1} = {2}", maximo, minimo, res)
Console.WriteLine()
Console.ReadLine()
Código para C#
var r = new Random();
int minimo = 20;
int maximo = 50;
var res = (r.NextDouble() * (maximo - minimo + 1)) + minimo;
Console.WriteLine("Un número Double entre {0} y {1} (incluidos)", minimo, maximo);
Console.WriteLine("(r.NextDouble * ({0} - {1} + 1)) + {1} = {2}", maximo, minimo, res);
Console.WriteLine();
Console.ReadLine();
La salida mostrada será algo así:
Figura 1. Salida del código de ejemplo
Casualmente el número generado aleatoriamente es 50 y pico… para que veas que el máximo también se incluye
Resumiendo
Para generar un número entre dos valores (ambos incluidos) usa el cálculo siguiente:
(r.NextDouble() * (maximo – minimo + 1)) + minimo
o este otro que también hace lo mismo:
(r.NextDouble() * (minimo – maximo)) + maximo
Resaltar aquí, que si quieres la misma funcionalidad que el método Next de la clase Random, es decir que el valor generado sea igual o mayor que mínimo pero menor que máximo tendrías que hacerlo de esta forma:
(r.NextDouble() * (maximo – minimo)) + minimo
Para finalizar, recordarte que le eches un vistazo a las explicaciones que doy en el artículo que te indiqué al principio:
Random.Next ese incomprendido
Espero que te sirva
Nos vemos.
Guillermo