Generowanie liczb losowych

C#:
Generowanie liczb losowych

Jak to zrobić:

Najczęstszym sposobem generowania losowych liczb w C# jest użycie klasy System.Random. Oto prosty przykład demonstrujący jej użycie:

using System;

public class RandomNumberExample
{
    static void Main(string[] args)
    {
        Random random = new Random();
        int randomNumber = random.Next(1, 100); // Generuje liczbę między 1 a 99
        Console.WriteLine($"Losowa liczba: {randomNumber}");
    }
}

Wygeneruje to liczbę losową, na przykład:

Losowa liczba: 42

Do generowania losowej liczby zmiennoprzecinkowej między 0,0 a 1,0, można użyć metody NextDouble:

double randomDouble = random.NextDouble();
Console.WriteLine($"Losowy double: {randomDouble}");

Jeśli pracujesz nad aplikacją wrażliwą na bezpieczeństwo, która wymaga kryptograficznej losowości, lepiej jest użyć klasy RNGCryptoServiceProvider znajdującej się w System.Security.Cryptography:

using System;
using System.Security.Cryptography;

public class SecureRandomExample
{
    static void Main()
    {
        byte[] randomNumber = new byte[4]; // Tworzy 4-bajtową długą liczbę losową
        using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
        {
            rng.GetBytes(randomNumber);
        }
        int value = BitConverter.ToInt32(randomNumber, 0);
        Console.WriteLine($"Kryptograficznie bezpieczna liczba losowa: {value}");
    }
}

Dogłębna analiza

Generowanie losowych liczb w C# ewoluowało na przestrzeni lat. Początkowo klasa System.Random była używana do generowania pseudo-losowych liczb. Jest to pseudo-losowe, ponieważ, biorąc pod uwagę konkretną wartość nasiona, wyprodukuje ten sam ciąg liczb, co może być użyteczne do debugowania lub powtarzalności testów.

Mimo że jest wystarczająca dla podstawowych potrzeb, System.Random nie jest bezpieczna w użyciu równoległym i może produkować przewidywalne wyniki, co nie jest odpowiednie dla aplikacji zależnych od bezpieczeństwa. Ta ograniczenie doprowadziło do wprowadzenia RNGCryptoServiceProvider dla kryptograficznej losowości, która jest bardziej bezpieczna, ale również bardziej zasobożerna.

Alternatywą w .NET Core i .NET 5+ jest klasa RandomNumberGenerator w System.Security.Cryptography do bezpiecznego generowania losowych liczb, która jest przeznaczona jako bardziej nowoczesna i łatwa w użyciu opcja w porównaniu do RNGCryptoServiceProvider.

Każda metoda generowania losowych liczb w C# ma swoje miejsce w zależności od wymagań aplikacji. Dla większości aplikacji wystarcza System.Random, ale dla tych, które wymagają bezpiecznych, nieprzewidywalnych losowych liczb, klasy kryptograficzne stanowią solidną alternatywę.