Generación de números aleatorios en C#: de principiante a profesional (resolviendo la pregunta principal de Stack Overflow)

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo generar un número entero aleatorio en C#: lo aclaramos de una vez por todas

\n

La pregunta sobre la generación de números aleatorios es una de las más populares en Stack Overflow. Parece que podría ser más simple, ¿verdad? Pero en la práctica, incluso los desarrolladores experimentados en C# cometen errores clásicos: obtienen los mismos valores en cada ejecución, se encuentran con secuencias no aleatorias u olvidan la seguridad para subprocesos. Hoy vamos a aclarar de una vez por todas cómo generar números enteros aleatorios en C# correctamente, y responderemos a todos los "por qué" de ese popular hilo de Stack Overflow.

\n\n

Este artículo es su oportunidad de dejar de copiar código de Internet y empezar a entender qué sucede realmente bajo el capó de System.Random. ¡Allá vamos!

\n\n

¿Por qué los principiantes obtienen el mismo número una y otra vez?

\n

La pregunta más común: "¡Creo un Random y siempre obtengo el mismo número!". Veamos un ejemplo de código típico que es una trampa:

\n\n
// ❌ MAL EJEMPLO\nfor (int i = 0; i < 5; i++)\n{\n    Random rnd = new Random();\n    Console.WriteLine(rnd.Next(1, 100));\n}\n
\n\n

¿Qué mostrará este código? Con un 99% de probabilidad, cinco números iguales. ¿Por qué? Porque Random usa el reloj del sistema para la inicialización (semilla). Cuando crea varias instancias de Random una tras otra, obtienen la misma "semilla" y, por lo tanto, generan una secuencia idéntica.

\n\n

La solución correcta es crear una sola instancia de Random y usarla repetidamente:

\n\n
// ✅ EJEMPLO CORRECTO\nRandom rnd = new Random();\nfor (int i = 0; i < 5; i++)\n{\n    Console.WriteLine(rnd.Next(1, 100));\n}\n
\n\n

Ahora cada número será diferente. Regla simple: un Random por cada hilo de ejecución.

\n\n

Random.Next(): tres formas de obtener un entero aleatorio

\n

La clase System.Random ofrece tres sobrecargas del método Next(). Veamos cada una con ejemplos:

\n\n

1. Random.Next() — sin parámetros

\n

Devuelve un número entero no negativo en el rango de 0 a Int32.MaxValue - 1. Es decir, de 0 a 2 147 483 646.

\n
Random rnd = new Random();\nint anyNumber = rnd.Next();\nConsole.WriteLine(anyNumber); // Por ejemplo: 1789034215\n
\n\n

2. Random.Next(Int32) — con límite superior

\n

Devuelve un número de 0 (inclusive) hasta el máximo especificado (exclusivo).

\n
int dice = rnd.Next(7); // 0, 1, 2, 3, 4, 5 o 6\nConsole.WriteLine(dice);\n
\n\n

3. Random.Next(Int32, Int32) — rango [min, max)

\n

La opción más popular para generar un número entero aleatorio en C# en un rango determinado.

\n
// Número aleatorio del 1 al 100 (inclusive)\nint score = rnd.Next(1, 101);\nConsole.WriteLine(score);\n
\n\n

Es importante recordar: el límite superior no está incluido. Para obtener un número del 1 al 6 (como en un dado), escriba Next(1, 7).

\n\n

Top 3 errores al trabajar con Random en C#

\n

Basándonos en preguntas reales de Stack Overflow C# random, destacamos los errores más comunes:

\n\n
    \n
  • Error n.º 1: Crear un nuevo Random dentro de un bucle. Ya lo vimos: esto produce números iguales. Solución: saque new Random() fuera del bucle.
  • \n
  • Error n.º 2: Random no es seguro para subprocesos. Si varios subprocesos usan la misma instancia de Random sin sincronización, pueden ocurrir fallos y valores cero. Use lock o ThreadLocal<Random>.
  • \n
  • Error n.º 3: Usar Random para contraseñas o tokens. System.Random es un generador pseudoaleatorio. ¡Es predecible! Para seguridad, necesita System.Security.Cryptography.RandomNumberGenerator.
  • \n
\n\n

¿Cómo generar números criptográficamente seguros?

Blogs

Book Recommendations