Random și Random.Shared în C# (.NET)

.NET BCL și CLI-ul dotnet .NET Framework 1.0 (Shared: .NET 6, GetItems/Shuffle: .NET 8)

Generează numere pseudo-aleatorii: Next(min, max), NextDouble, amestecare cu Shuffle și alegere cu GetItems.

Sintaxă C#
Random.Shared.Next(1, 7)   Random.Shared.Shuffle(tablou)   Random.Shared.GetItems(optiuni, 6)

Ce face Random și Random.Shared

Random.Shared (.NET 6) este o instanță gata creată, sigură pentru mai multe fire de execuție; nu mai trebuie să creezi new Random() peste tot. Next(min, max) întoarce un întreg între min inclusiv și max exclusiv, deci un zar este Next(1, 7). NextDouble() dă un număr între 0 și 1.

Din .NET 8 există Shuffle (amestecă un tablou pe loc) și GetItems (alege elemente cu repetiție). Cu new Random(42) secvența este aceeași la fiecare rulare, util în teste.

Random nu este potrivit pentru parole, coduri de resetare sau tokenuri: folosește System.Security.Cryptography.RandomNumberGenerator (GetInt32, iar din .NET 8 GetString).

Exemple

Exemplul 1: Zar, alegere și amestecare

int zar = Random.Shared.Next(1, 7);
Console.WriteLine($"Zar: {zar}");

string[] premii = ["carte", "cană", "tricou"];
Console.WriteLine($"Premiu: {premii[Random.Shared.Next(premii.Length)]}");

int[] ordine = [1, 2, 3, 4, 5];
Random.Shared.Shuffle(ordine);
Console.WriteLine(string.Join(" ", ordine));

Rezultat posibil (diferă la fiecare rulare)

Zar: 4
Premiu: cană
3 5 1 4 2

Exemplul 2: Cod promoțional și cod de securitate

GetItems e suficient pentru un cod promoțional; codul de verificare trimis prin SMS se generează criptografic.

using System.Security.Cryptography;

char[] caractere = "ABCDEFGHJKLMNPRSTUVWXYZ23456789".ToCharArray();
string promo = new string(Random.Shared.GetItems(caractere, 6));
Console.WriteLine($"Cod promo: {promo}");

int codSms = RandomNumberGenerator.GetInt32(100000, 1000000);
Console.WriteLine($"Cod SMS: {codSms}");

Rezultat posibil (diferă la fiecare rulare)

Cod promo: K7RM3X
Cod SMS: 482915

Greșeli frecvente

  • Next(1, 6) pentru un zar nu dă niciodată 6: limita de sus este exclusivă.
  • new Random() creat de multe ori la rând pe .NET Framework putea da aceleași numere (seed din ceas). Pe .NET modern problema nu mai apare, dar Random.Shared rămâne varianta simplă.
  • O instanță new Random() nu este sigură pentru mai multe fire: folosită în paralel, starea ei internă se poate strica (versiunile vechi ajungeau să întoarcă doar 0). Random.Shared nu are această problemă.

Comenzi înrudite

  • Guid (NewGuid, CreateVersion7): Identificator unic de 128 de biți: generare cu NewGuid sau CreateVersion7 (ordonat în timp), citire, formatare și comparare.
  • Math (Round, Pow, Sqrt, Clamp): Clasa statică Math: rotunjire, putere, radical, valoare absolută, minim/maxim și limitarea unei valori într-un interval.