Como gerar um número inteiro aleatório em C#: entendendo de uma vez por todas
\nA geração de números aleatórios é uma das perguntas mais populares no Stack Overflow. Parece simples, certo? Mas, na prática, até desenvolvedores experientes em C# cometem erros clássicos: obtêm valores idênticos a cada execução, enfrentam sequências não aleatórias ou esquecem da segurança em threads. Hoje, vamos entender de uma vez por todas como gerar números inteiros aleatórios em C# corretamente e responder a todos os "porquês" daquela pergunta top do Stack Overflow.
\n\nEste artigo é sua chance de parar de copiar código da internet e começar a entender o que realmente acontece nos bastidores do System.Random. Vamos nessa!
Por que iniciantes sempre obtêm o mesmo número repetidamente?
\nA pergunta mais comum é: "Eu crio um Random e sempre recebo o mesmo número!". Vejamos um código típico que é uma armadilha:
\n\n// ❌ EXEMPLO RUIM\nfor (int i = 0; i < 5; i++)\n{\n Random rnd = new Random();\n Console.WriteLine(rnd.Next(1, 100));\n}\n\n\nO que esse código exibirá? Com 99% de chance, cinco números idênticos. Por quê? Porque o Random usa o relógio do sistema para inicialização (seed). Quando você cria várias instâncias de Random em sequência, elas recebem a mesma "semente" e, consequentemente, geram a mesma sequência.
A solução correta é criar uma única instância de Random e reutilizá-la:
\n\n// ✅ EXEMPLO CORRETO\nRandom rnd = new Random();\nfor (int i = 0; i < 5; i++)\n{\n Console.WriteLine(rnd.Next(1, 100));\n}\n\n\nAgora cada número será diferente. Regra simples: um Random por thread de execução.
\n\nRandom.Next(): três maneiras de obter um número inteiro aleatório
\nA classe System.Random oferece três sobrecargas do método Next(). Vamos analisar cada uma com exemplos:
1. Random.Next() — sem parâmetros
\nRetorna um número inteiro não negativo no intervalo de 0 a Int32.MaxValue - 1. Ou seja, de 0 a 2.147.483.646.
Random rnd = new Random();\nint anyNumber = rnd.Next();\nConsole.WriteLine(anyNumber); // Exemplo: 1789034215\n\n\n2. Random.Next(Int32) — com limite superior
\nRetorna um número de 0 (inclusive) até o valor máximo especificado (exclusive).
\nint dice = rnd.Next(7); // 0, 1, 2, 3, 4, 5 ou 6\nConsole.WriteLine(dice);\n\n\n3. Random.Next(Int32, Int32) — intervalo [min, max)
\nA opção mais popular para gerar números inteiros aleatórios em C# em um intervalo específico.
\n// Número aleatório de 1 a 100 (inclusive)\nint score = rnd.Next(1, 101);\nConsole.WriteLine(score);\n\n\nImportante lembrar: o limite superior não é incluído. Para obter um número de 1 a 6 (como em um dado), use Next(1, 7).
Top 3 erros ao trabalhar com Random em C#
\nCom base em perguntas reais do Stack Overflow C# random, destacamos os erros mais comuns:
\n\n- \n
- Erro nº1: Criar um novo Random dentro de um loop. Já vimos que isso gera números idênticos. Solução: coloque
new Random()fora do loop. \n - Erro nº2: Random não é seguro para threads. Se várias threads usarem a mesma instância de
Randomsem sincronização, podem ocorrer falhas e valores zero. UselockouThreadLocal<Random>. \n - Erro nº3: Usar Random para senhas ou tokens.
System.Randomé um gerador pseudoaleatório. Ele é previsível! Para segurança, useSystem.Security.Cryptography.RandomNumberGenerator. \n