Tilfældige tal
Der er flere måder at skabe tilfældige tal i C#.
Information til undervisere
Der er tit brug for et tilfældigt tal - jeg bruger det selv i flere af opgaverne - så dette er blot til orientering. Bare vis brug af System.Random og fortæl kort om seed. En lidt udvidet gennemgang kan inkludere brugen af Bogus-pakken (se nedenfor) og den brug i eksempelvis test. I den mere avancerede undervisning - se brugen af tilfældige tal i gennemgang af DI.
Brug af System.Random
System.Random er den mest almindelige klasse til at generere tilfældige tal i C#. Den tilbyder en række metoder til at generere tilfældige tal inden for forskellige intervaller.
Info
Bemærk, at fra .NET 5 er brugen af System.Random.Shared anbefalet i stedet for selv at skabe en instans. Ved brug af den statiske Shared instans kan du være sikker på, at instansen er trådsikker.
Simpelt brug af System.Random
For at generere et tilfældigt tal mellem 1 og 6 (inklusiv), kan følgende kode anvendes:
Med Top-level statements
int TilfældigtTal(int min, int max)
{
return System.Random.Shared.Next(min, max);
}
// Genererer et tilfældigt heltal mellem 1 og 6 (inklusiv 1, eksklusiv 7)
int tal = TilfældigtTal(1, 7);
Console.WriteLine(tal);
Uden Top-level statements
internal class Program
{
private static void Main(string[] args)
{
// Genererer et tilfældigt heltal mellem 1 og 6 (inklusiv 1, eksklusiv 7)
int tal = TilfældigtTal(1, 7);
Console.WriteLine(tal);
}
static int TilfældigtTal(int min, int max)
{
return System.Random.Shared.Next(min, max);
}
}
Liste af tilfældige tal
Nogen gange har du brug for en liste/array af tilfældige tal. Uden at forstå syntaks eller lister/arrays kan du evt. kopiere denne kode:
Brug af seed
Seed-værdien er et tal, der bruges som input til random number generator algoritmen. Hvis to Random-instanser oprettes med samme seed, genererer de samme sekvenser af tilfældige tal. Hvis seed-værdien ikke angives, bruger Random-klassen en standard seed-værdi, der er baseret på systemets aktuelle tid.
Her er et eksempel på, hvordan man bruger seed:
int seed = 42;
Random seededRandom = new Random(seed);
int tal = seededRandom.Next(1, 7); // Genererer et tilfældigt heltal mellem 1 og 6 (inklusiv 1, eksklusiv 7)
Brug af service fra random.org
random.org tilbyder en API-tjeneste, der genererer tilfældige tal baseret på atmosfærisk støj. For at bruge denne tjeneste til at generere et tilfældigt tal mellem 1 og 6, kan følgende kode anvendes:
Tip
For at bruge denne tjeneste kan det være nødvendigt at tilføje NuGet-pakken System.Net.Http til projektet.
Med Top-level statements
Synkront
using System.Net.Http;
int TilfældigtTal(int min, int max)
{
using var httpClient = new HttpClient();
string requestUri = $"https://www.random.org/integers/?num=1&min={min}&max={max - 1}&col=1&base=10&format=plain&rnd=new";
string result = httpClient.GetStringAsync(requestUri).Result;
return int.Parse(result);
}
// Genererer et tilfældigt heltal mellem 1 og 6 (inklusiv 1, eksklusiv 7)
int tal = TilfældigtTal(1, 7);
Console.WriteLine(tal);
Asynkront
using System.Net.Http;
using System.Threading.Tasks;
async Task<int> TilfældigtTal(int min, int max)
{
using var httpClient = new HttpClient();
string requestUri = $"https://www.random.org/integers/?num=1&min={min}&max={max - 1}&col=1&base=10&format=plain&rnd=new";
string result = await httpClient.GetStringAsync(requestUri);
return int.Parse(result);
}
// Genererer et tilfældigt heltal mellem 1 og 6 (inklusiv 1, eksklusiv 7)
int tal = await TilfældigtTal(1, 7);
Console.WriteLine(tal);
Uden Top-level statements
Synkront
using System.Net.Http;
internal class Program
{
private static void Main(string[] args)
{
// Genererer et tilfældigt heltal mellem 1 og 6 (inklusiv 1, eksklusiv 7)
int tal = TilfældigtTal(1, 7);
Console.WriteLine(tal);
}
static int TilfældigtTal(int min, int max)
{
using var httpClient = new HttpClient();
string requestUri = $"https://www.random.org/integers/?num=1&min={min}&max={max - 1}&col=1&base=10&format=plain&rnd=new";
string result = httpClient.GetStringAsync(requestUri).Result;
return int.Parse(result);
}
}
Asynkront
using System.Net.Http;
using System.Threading.Tasks;
internal class Program
{
private static async Task Main(string[] args)
{
// Genererer et tilfældigt heltal mellem 1 og 6 (inklusiv 1, eksklusiv 7)
int tal = await TilfældigtTal(1, 7);
Console.WriteLine(tal);
}
static async Task<int> TilfældigtTal(int min, int max)
{
using var httpClient = new HttpClient();
string requestUri = $"https://www.random.org/integers/?num=1&min={min}&max={max - 1}&col=1&base=10&format=plain&rnd=new";
string result = await httpClient.GetStringAsync(requestUri);
return int.Parse(result);
}
}
RandomNumberGenerator
RandomNumberGenerator er en abstrakt klasse i .NET, der repræsenterer en kryptografisk sikker pseudotilfældig talgenerator (CSPRNG). Denne klasse leverer metoder til at generere kryptografisk sikre tilfældige tal, hvilket er vigtigt i sikkerhedssammenhænge, såsom kryptering, nøglegenerering og autentificering.
RandomNumberGenerator-klassen findes i System.Security.Cryptography-navnerummet, og den mest almindeligt anvendte implementering er RNGCryptoServiceProvider-klassen.
Her er et eksempel på, hvordan man kan bruge RandomNumberGenerator til at generere et tilfældigt tal mellem 1 og 6:
using System.Security.Cryptography;
public static int RollDice()
{
using var rng = new RNGCryptoServiceProvider();
byte[] randomBytes = new byte[4];
rng.GetBytes(randomBytes);
int randomNumber = BitConverter.ToInt32(randomBytes, 0);
return Math.Abs(randomNumber % 6) + 1;
}
I dette eksempel oprettes en ny instans af RNGCryptoServiceProvider, og metoden GetBytes bruges til at udfylde et byte-array med tilfældige tal. Derefter konverteres byte-arrayet til et heltal ved hjælp af BitConverter.ToInt32. Til sidst beregnes modulo-operationen for at få et tal mellem 1 og 6.
Bemærk, at RandomNumberGenerator er langsommere end Random-klassen, men den leverer kryptografisk sikre tilfældige tal. Hvis sikkerhedsniveauet ikke er en bekymring, kan Random-klassen være et mere effektivt valg til generering af tilfældige tal.
Pakker på NuGet
Der findes naturligvis en masse pakker på NuGet - her er de mest populærer:
-
Bogus: En af de bedste “random” pakker - se evt. min side om det.
-
MathNet.Numerics: En matematikbibliotek, der indeholder mange funktioner, herunder generering af tilfældige tal ved hjælp af forskellige fordelinger.
-
Troschuetz.Random: En samling af algoritmer til generering af tilfældige tal i C#, som understøtter en lang række sandsynlighedsfordelinger.