C# Programming

Generación de Números Aleatorios en C#: Guía Completa

Spread the love

Generación de Números Aleatorios en C#: Una Guía Completa

  1. Entendiendo la Clase Random
  2. Generando Enteros Aleatorios
  3. Generando Números de Punto Flotante Aleatorios
  4. Generando Múltiples Números Aleatorios de Forma Eficiente
  5. Sembrando el Generador de Números Aleatorios
  6. Números Aleatorios Criptográficamente Seguros
  7. Conclusión
  8. Preguntas Frecuentes

1. Entendiendo la Clase Random

La clase System.Random de C# es la herramienta principal para generar números pseudoaleatorios. Estos no son realmente aleatorios (requieren una fuente física de entropía), pero las secuencias parecen aleatorias para la mayoría de las aplicaciones. Se generan de forma determinista a partir de un valor inicial de semilla. La misma semilla produce la misma secuencia, útil para la depuración, pero crucial de recordar para las aplicaciones que necesitan verdadera aleatoriedad.

2. Generando Enteros Aleatorios

El método principal es Random.Next(). Sobrecargas clave:

  • Next(): Devuelve un entero no negativo menor que int.MaxValue.
  • Next(maxValue): Devuelve un entero no negativo menor que maxValue (maxValue debe ser positivo).
  • Next(minValue, maxValue): Devuelve un entero ≥ minValue y < maxValue (maxValue > minValue).

Ejemplo:


using System;

public class RandomNumberGenerator
{
    public static void Main(string[] args)
    {
        Random random = new Random();

        int randomNumber1 = random.Next(10); // 0 a 9
        Console.WriteLine($"Número aleatorio 1: {randomNumber1}");

        int randomNumber2 = random.Next(5, 15); // 5 a 14
        Console.WriteLine($"Número aleatorio 2: {randomNumber2}");
    }
}

3. Generando Números de Punto Flotante Aleatorios

Para generar números de punto flotante de doble precisión aleatorios entre 0.0 (inclusive) y 1.0 (exclusivo), use random.NextDouble(). Escala y desplaza esto para otros rangos:


double randomNumber = random.NextDouble() * 100; // 0.0 a 100.0

4. Generando Múltiples Números Aleatorios de Forma Eficiente

Reutilice una sola instancia de Random para mayor eficiencia cuando genere muchos números. Crear múltiples instancias rápidamente (usando el constructor predeterminado, sembrado por el reloj del sistema) puede llevar a secuencias similares, reduciendo la aleatoriedad aparente.


Random random = new Random();
for (int i = 0; i < 10; i++)
{
    int randomNumber = random.Next(1, 101); // 1 a 100 (inclusive)
    Console.WriteLine($"Número aleatorio {i + 1}: {randomNumber}");
}

5. Sembrando el Generador de Números Aleatorios

Controle la secuencia proporcionando una semilla al constructor Random:

  • Reproducibilidad: Misma semilla = misma secuencia (esencial para las pruebas).
  • Secuencias específicas: Útil para simulaciones.

Random random1 = new Random(12345);
Console.WriteLine($"Número aleatorio con semilla 12345: {random1.Next(100)}");

Random random2 = new Random(12345);
Console.WriteLine($"Número aleatorio con semilla 12345 (de nuevo): {random2.Next(100)}"); // Igual que el anterior

Random random3 = new Random(); // Tiempo actual como semilla
Console.WriteLine($"Número aleatorio con semilla de tiempo actual: {random3.Next(100)}");

6. Números Aleatorios Criptográficamente Seguros

Para aplicaciones sensibles a la seguridad, nunca use System.Random. Use System.Security.Cryptography.RandomNumberGenerator en su lugar.

7. Conclusión

La clase Random proporciona una generación fácil de números pseudoaleatorios. Comprender la siembra y la reutilización de instancias es clave tanto para la reproducibilidad como para la eficiencia. Priorice los RNG criptográficos para la seguridad.

8. Preguntas Frecuentes

P: ¿Son realmente aleatorios los números? R: No, pseudoaleatorios. Parecen aleatorios pero se generan de forma determinista.

P: ¿Cómo generar números de punto flotante aleatorios? R: Use random.NextDouble() y escale/desplace según sea necesario.

P: ¿Qué pasa con los números aleatorios criptográficamente seguros? R: Use System.Security.Cryptography.RandomNumberGenerator.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *