Cómo generar un número entero aleatorio en C#: lo aclaramos de una vez por todas
\nLa 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\nEste 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!
¿Por qué los principiantes obtienen el mismo número una y otra vez?
\nLa 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.
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\nAhora cada número será diferente. Regla simple: un Random por cada hilo de ejecución.
\n\nRandom.Next(): tres formas de obtener un entero aleatorio
\nLa clase System.Random ofrece tres sobrecargas del método Next(). Veamos cada una con ejemplos:
1. Random.Next() — sin parámetros
\nDevuelve un número entero no negativo en el rango de 0 a Int32.MaxValue - 1. Es decir, de 0 a 2 147 483 646.
Random rnd = new Random();\nint anyNumber = rnd.Next();\nConsole.WriteLine(anyNumber); // Por ejemplo: 1789034215\n\n\n2. Random.Next(Int32) — con límite superior
\nDevuelve un número de 0 (inclusive) hasta el máximo especificado (exclusivo).
\nint dice = rnd.Next(7); // 0, 1, 2, 3, 4, 5 o 6\nConsole.WriteLine(dice);\n\n\n3. Random.Next(Int32, Int32) — rango [min, max)
\nLa 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\nEs 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).
Top 3 errores al trabajar con Random en C#
\nBasá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
Randomsin sincronización, pueden ocurrir fallos y valores cero. UselockoThreadLocal<Random>. \n - Error n.º 3: Usar Random para contraseñas o tokens.
System.Randomes un generador pseudoaleatorio. ¡Es predecible! Para seguridad, necesitaSystem.Security.Cryptography.RandomNumberGenerator. \n